基本语法
pass
当方法体还没有定义好,但是想先调试代码时可以先用pass
例如:
1 | def nop(): |
此时 nop 函数也可以被调用,只是什么都不会做
默认参数
定义默认参数要牢记一点:默认参数必须指向不变对象!
1 | def add_end(L=[]): |
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
切片(slice[0:1:2])
1 | str = '123456789' |
切片的顺序的不会变的,都是从前往后,能改变的只是起止的位置范围,每隔几个取一次
迭代
1 | for key in d # 遍历 key |
列表生成式
1 | L1 = ['Hello', 'World', 18, 'Apple', None] |
总结:
[数值输出时还可以做处理 forInList 条件]
条件里要加 if
, 虽然不加也是返回布尔值,但还是要加if
迭代器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
- 一类是集合数据类型,如list、tuple、dict、set、str等;
- 一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
迭代器都是可迭代对象,但是可迭代对象不一定都是迭代器:
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。list、dict、str一开始时就能知道他们的长度,所以他们不是迭代器.