python
基础
1 | a = input('输入')//input()返回的数据类型是str,需要进行转换 |
list
list:列表,一种有序的集合,可以随时添加和删除其中的元素
list元素的数据类型可以不同
list元素也可以是另一个list
list = [ 'a' , [1,2] ]
1 | classmate = ['a','b','c'] |
tuple
tuple也是有序列表,但是tuple一旦初始化就不能修改,代码更安全
1 | t = (1,2) |
dict
字典,使用键值对存储
1 | d = {'a': 1 , 'b': 2 ,'c': 3} |
函数
max
可以接收任意多个参数,并返回最大的那个
时间
1 | import time |
获取格式化时间
1 | import time |
格式化日期
1 | import time |
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
- %m 月份(01-12)
- %d 月内中的一天(0-31)
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
- %M 分钟数(00-59)
- %S 秒(00-59)
- %a 本地简化星期名称
- %A 本地完整星期名称
- %b 本地简化的月份名称
- %B 本地完整的月份名称
- %c 本地相应的日期表示和时间表示
数据类型转换
1 | int('123') |
定义函数
1 | def my_x(x): |
返回多个值
1 | def move(x,y): |
默认参数
1 | def power(x,n=2): |
可变参数
传入的参数的个数时可变的
1 | def cal(numbers): |
1 | def cal(*numbers): |
关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
1 | def person(name,age,**kw): |
高级特性
切片
取一个list或tuple的部分元素
a[0:3]
表示从索引0开始取,知道索引3为止,但不包括索引3
a[-2:-1]
表示从倒数第二个开始取,知道倒数第一个,但不包括倒数第一个
tuple也可以用切片操作,只是操作结果依旧是tuple
迭代
python中只要时可迭代对象,无论有无下标,都可以的迭代
1 | d = {'a':1,'b':2} |
字符串也是可迭代对象
for ch in 'abc':
对list实现下标循环
内置的
enumerate
函数可以把一个list变成索引—元素对
1 | for i,value in enumerate(['a','b,'c]): |
列表生成式
用来创建list的生成式
1 | [x*x for x in range(1,11) if x % 2 == 0] |
1 | [m+n for m in 'abc' for n in 'xyz'] |
dict 的 items()
可以同时迭代key和value
for key,value in d.items():
if…else
[x for x in range(1,11) if x % 2 ==0]
不能在最后的if加上else,最后的if为筛选条件
[x if x % 2 == 0 else -x for x in range(1,11)]
[-1,2,-3,4,-5...]
if写在for前面必须加else,需要根据x计算记过,因为必须加上else
生成器 (generator)
把列表生成式的
[]
改成()
1
2
3
4
5g = (x*x for x in range(10))
//打印g的每一个元素
for n in g:
print(n)
1 | def fib(max): |
a,b=b,a+b
相当于t = (b,a+b) a=t[0] b = t[1]
fib函数定义了斐波那契数列的推算规则,要把fib函数变成generator函数,只需要把print(b)
改为yield b
就可以了
1 | def fib(max): |
迭代器
- 凡是可作用于
for
循环和next()函数
的对象都是Iterable
类型 - 集合数据类型如
list,dict,str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象
函数式编程
高阶函数
map / reduce
map
函数接收两个参数,一个是函数,一个是Iterable
;map
将传入的函数依次作用到序列的额每个元素,并把结果作为新的Iterator
返回
1 | def f(x): |
reduce
把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是
reduce(f,[x1,x2,x3]) = f(f(x1,x2),x3)
filter
filter
接收一个函数和一个序列,把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素
sorted
排序算法
sorted([1,4,2],key=abs)
它可以接收一个key函数来实现自定义的排序
匿名函数
list(map(lambda x:x*x,[1,2,3]))
]关键字
lambda
表示匿名函数,冒号前面的x表示函数参数
偏函数
1 | int('123') |
面向对象编程
类和实例
类是抽象的模板,而实例是根据类创建出来的一个个具体的对象
class Student(Object)
类名通常是大写开头的单词,括号里的是从哪个类继承下来的,一般使用object类
1 | class Student(object): |
_init_
方法的第一个参数永远是self
,表示创建实例本身
访问限制
实例的变量名如果以
__
开头,就变成了一个私有变量
1 | class Student(object): |
继承和多态
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写
获取对象信息
type
判断对象类型
isinstance
判断对象类型,还可以判断class的继承关系
isinstance(d,Dogs)
还可以判断一个变量是否是某些类型中的一种
isinstance([1,2],(list,tuple))//true
isinstance((1,2),(list,tuple))//true
使用dir
要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的 list
实例属性和类属性
直接在class中定义属性,这种属性是类属性,归类所有
1 | class Student(object): |
面向对象高级编程
使用__slots__
限制实例的属性;比如只允许对Student实例添加 name 和 age 属性
1 | class Student(object): |
__slots__
定义的属性仅对当前实例起作用,对继承的子类不起作用
多重继承
1 | class Dog(Mammal,Runnable): |
定制类
__str__
打印实例
1 | class Stu: |
__iter__
一个类想被用于
for in
循环,就需要实现一个__iter__
方法,该方法返回一个迭代对象,然后,py的 for 循环就会不断调用该迭代对象的__next__
方法拿到循环的下一个值
1 | class Fib(object): |
__getitem__
需要按照下标取出元素,需要实现
__getitem__
方法
1 | class Fib(object): |
枚举类
1 | from enum inport Enum |
错误、调试和测试
错误处理
1 | try: |
IO编程
文件读写
读文件
f = open('/.../.../..txt','r')
f.read()
一次读取文件的全部内容
f.close()
文件使用完毕后必须关闭
1 | try: |
调用read会一次性读取文件的全部内存,如果文件过大,内存就爆了,因此在读取文件时,可以反复调用read(size)
方法,每次最多读取 size 个字节的内容。另外调用readline()
可以每次读取一行内容。
二进制文件
读取二进制文件,比如图片、视频等,用 rb 模式打开文件
f = open('/.../..jpg','rb)
写文件
写文件和读文件是一样的,区别主要是在open函数中需要传入标识符
w
或wb
表示写二进制文件
写文件时不会立刻把数据写入磁盘,而是放到内存缓存起来,只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘
1 | with open('/.../..txt','w') as f: |
目录
mkdir方法
在当前目录下创建新的目录
1 | import os |
chdir方法
改变当前目录
1 | import os |
getcwd方法
显示当前的工作目录
1 | import os |
rmdir方法
删除目录目录名称以参数传递。
在删除这个目录之前,它的所有内容应该先被清除。
1 | import os |