0%

Python 学习笔记

基本语法

pass

当方法体还没有定义好,但是想先调试代码时可以先用pass
例如:

1
2
def nop():
pass

此时 nop 函数也可以被调用,只是什么都不会做

默认参数

定义默认参数要牢记一点:默认参数必须指向不变对象!

1
2
3
def add_end(L=[]):
L.append('END')
return L

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

切片(slice[0:1:2])

1
2
3
4
str = '123456789'
str[0:4:2] # 从下角标 0 开启,到下角标为 4 的(不包括 4),每隔 2 个取一个
str[-5] # 从倒数第五个开始,往后的全部
str[:-1] # 从头开始一直取到下角标为-1 的(不包括)

切片的顺序的不会变的,都是从前往后,能改变的只是起止的位置范围,每隔几个取一次

迭代

1
2
3
for key in d # 遍历 key
for value in d.values() # 遍历对象的值
for k, v in d.items() # 遍历对象的每个键值对

列表生成式

1
2
3
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if isinstance(s, str)]
print(L2) # ['hello', 'world', 'apple']

总结:
[数值输出时还可以做处理 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一开始时就能知道他们的长度,所以他们不是迭代器.