《Python编程从入门到实践》总结
作者 Eric Matthes 著, 袁国忠 译
中国工信出版集团,人民邮电出版社
起步
- 基本属性:跨平台,脚本语言
- 认识python2与python3,其升级的意义与普通软件不一样,有点类似于windows的framework, 不同版本可以并存,处理不同问题各有优势。后续应该需要深入Python的应用,才能体会。本书建议使用py3
- 跨平台部署,windows, linux, osx[苹果]
- 32,64 应该只是影响性能
- 编辑器:文本编辑器即可,本文推荐Geany,安装后并没有显著优势。小组中用anaconda,相对而言在win环境更方便。借助anaconda,可以方便地配置python在各种需求下的packege.
变量
- 注意保留字,变量与函数名杜绝有重复使用的现象
- 报错信息:学会使用traceback,一般会提示的地方可能是上下文,所以不要只看到报错的一个位置
字符串
单引号、双引号;三引号是注释内容
- 连接字符串:+,即完成字符串拼接计算
- 特殊字符:\t 制表符 \n 换行等
- 去除空格:rstrip
- 字符串使用过程中,单、双引号的合理使用
数字
- 四则运算
- 浮点运算:注意与整数的混合运算
- 字符与数字的混合运算,需要注意str()变换
注释
- 行注释#
- 块注释'''
列表
- 数字列表:向量,矩阵
- 字符列表:字典[后面章节有专门的字典,这里表达的不是后面的字典类型,逻辑意义]
- 0是起点|和C语言类似,区别于matlab等
- 元素修改
append(),del(),pop(),remove()
- 排序
sort(),sorted(), reverse(),
操作列表
- 遍历:for, while
- 代码缩进:美观,代码级别,尤其是判断与循环涉及的小代码段
- 代码中的冒号,引出后面的代码段
- 切片:选取列表的某一段
- 元组 vs 列表
参数值等不可修改元素的列表,定义成元组
- 代码格式注意
缩进
行的长度:80字符
空行
if语句
条件判断
- 条件测试:字符串比较,数字比较
- 多条件,布尔表达式
if
if-else
if-elif-else
elif*n
- else子句通常可省略
ch6 字典
定义
- {},键值对
使用字典
alien_0={'color':'green','points':5}
- 添加
- 删除:del
遍历字典
for key,value in user_0.items():
print(key)
print(value)
- 排序: sorted
- .keys()
- .values()
嵌套字典
- 字典 in 列表
alien_0={'color':'green','points':5}
alien_1={'color':'red','points':50}
alien_2={'color':'yellow','points':10}
aliens = [alien_0,alien_1,alien_2]
for alien in aliens:
print(alien)
-
列表 in 字典
-
字典 in 字典
不推荐这种方式,可以考虑 字典in列表 进行使用
ch7 用户输入和while循环
input vs raw_input()
- input("hint by words")
- int() # enter number
- 求余%
while
- 退出条件 while condition
- break
- continue
- ctrl+c
千万注意循环跳出条件,单元测试的主要问题点
while 处理列表和字典
- for vs while
- for 会预制循环条件,不应修改循环对象
- while 用于调整循环遍历对象时的循环处理
while 删除指定元素
- []
pets = ['dog','cat,'dog','goldfish','cat','rabbit']
while 'cat' in pets:
pets.remove('cat')
ch8 函数
def functionname(var):
code_body
functionname(in_var)
参数
- 形参
- 实参
实参就是形参的取值,多数人不区分两者
参数传递
- 位置实参
注意传递顺序
- 关键字实参
传递时指明形参与实参的对应
- 默认值
- 形参未赋值时的默认值
- 默认值要往后放,不能前面有默认值,而后面没有,顺序赋值
返回值
- return
- 返回字典
入参为列表
- 类似于C的数组、指针
- 需要禁止修改入参,将列表用切片方式传入副本
- 主要考虑点是效率:效率会因为内存使用而增加时间成本
- 入参为元组,可实现可变参数的输入(量的变化)
- 位置实参与任意实参结合
即位置实参与元组参数的结合,注意默认顺序赋值的原因,需要将变参(任意实参)放在最后一个形参
- 任意数量的关键字实参
def fun(invar1,**invar2)
引入模块
函数存储在模块
存储为a.py
新的b.py中调用模块a
import a
import module_name
module_name.function_name()
from module_name import function_name
from module_name import fun1, fun2, fun3
- as 别名
import module_name as newmodulename
- 导入所有:from module_name import *
函数编写指南
- 小写+下划线,避免大写
- 形参等号两边不要留空格
- 相邻函数的定义,隔两空行
ch9 类 class
关键词: 面向对象,实例
创建和使用类
命名类首字母大写
全部小写的,是函数和变量
__init__()
if __name__ == '__main__':
#测试使用
- 注意self的使用,外部使用类时,self参数相当于自动隐藏
使用类
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
long_name = str(self.year)+' ' + self.make + ' ' + self.model
return long_name.title()
#%%
if __name__ == '__main__':
my_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
- 可以设置方法来操作属性值
- 但是要注意到:有权限访问到程序的人,都可以直接访问属性值并进行修改。因此,需要注意细节,控制好访问权限
继承
- super.init
- 父类、子类需在一个文件内
- import 也是可以引入的,后文中有专门的类导入
import BookRC as bc
class EECar(bc.Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
if __name__=="__main__":
neweecar = EECar('ford','yibo',2014)
print(neweecar.get_descriptive_name())
- 重写父类的方法名
同名重写即可,根据函数作用域即可实现子类使用新的方法,不影响父类的同名方法
- 实例作为属性
需要递进.进行属性访问
类的导入
from module_file_name import Class_name
# 关于用户定义的类、函数,尽量定义清晰,准确定义与引用
- 导入类与导入模块的函数一样
标准库
python给出的标准库,通常而言,标准的库肯定比自己写的效率更好一点
不要自己造轮子,所有程序的轮子,大部分就存在于标准库
编码风格
- 类名:驼峰命名法,首字母大写,无下划线
- 模块、实例:小写英文+下划线
- 类中一个空行分隔方法
- 模块中,两个空行分隔类
- 先导入标准库模块,空行隔开后导入用户自定义模块
文件
新建文件
- with|自动关闭,调试期间建议用with,调试通过后再修订为open\close文件操作对
- open,close
- 文件路径
- 相对路径
windows里面用\,linux使用/
写入文件
- open带参数,open(filename, 'w')|{'w','r','a','r+'}
- write()|不带换行符
- py只能读出字符串,也只能写入字符串
异常
- try-except
ZeroDivisionError
- try-except-else
FileNotFoundError
异常抛出的程序段可以让程序在记录完异常后继续处理问题
- pass
只要有外部因素:文件、输入、网络,就会有可能造成异常发生,注意编程时考虑到
分析文本
- split()
存储数据
json
json.dump(var,fobj)
json.load(fobj)
测试
相关模块
- 单元测试
- 测试用例
import unittest
class FunTestCase(unittest.TestCase):
def test_case1(self):
self.assertEqual(fun_return_value, target_value)
def test_case2(self):
self.assertEqual(fun_return_value, target_value)
unittest.main()
测试类
- unittest Module
对所有test_开头的函数自动运行进行测试
方法 | 用途 |
---|---|
assertEqual(a,b) | 核实a==b |
assertNotEqual(a,b) | 核实a!=b |
assertTrue(x) | 核实x为True |
assertFalse(x) | 核实x为False |
assertIn(item,list) | 核实item in list |
assertNotIn(item,list) | 核实item not in list |
- setUp()
好处是可以一个实例(用例),做多个方法的测试
网友评论