声明:所做笔记是基于廖雪峰老师的python教程
只有list是可变对象
set 中的元素是无序的,比如s = {1, 2, 3},即使现在看起来1是第一个元素,2是第二个元素,但实际上可能并非如此,因此没有s[0],s[1]这种操作。
None和‘’、[]、{}等不一样。
只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。非零即为一。
for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value。默认迭代的是value,当然可以用d.keys()对key进行迭代。
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.items():
... print(k, '=', v)
...
y = B
x = A
z = C
from collections import Iterable
isinstance('abc', Iterable)
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [x * y for x in range(1, 6) for y in range(6, 11)]
[6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]
>>> [x * y for x in range(1, 6) if x % 2 == 0 for y in range(6, 11) if y % 2 == 1]
[14, 18, 28, 36]
>>> [x if x % 2 == 0 for x in range(1, 11)]
File "", line 1
[x if x % 2 == 0 for x in range(1, 11)]
^
SyntaxError: invalid syntax
>>> L1 = ['Hello', 'World', 18, 'Apple', None]
>>> g = (x if x % 2 else -x for x in range(11))
>>> for x in g:
print(x)
0
1
-2
3
-4
5
-6
7
-8
9
-10
a, b = b, a + b
相当于
t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]
可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以被next()函数调用并不断返回下一个值的对象称为迭代器。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
range()返回的是一个可迭代对象(Iterable)。
>>> f = abs
>>> f(-1)
1
>>> abs = 10
>>> abs(-10)
Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not callable
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
list= [1, -2, 3, -4, 5]
re = sorted(l, key = abs)
然后sorted()函数按照keys进行排序,并按照对应关系返回list相应的元素。
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:
>>> f1()
9
>>> f2()
9
>>> f3()
9
全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
>>> def add(x, y):
return x + y
>>> ad = functools.partial(add, y = 1)
>>> ad(2)
3
>>> ad(4)
5
>>>
注意的问题:
def fun(a, b, c):
return a + b + c
f = functools.partial(fun, 1, 2)
如果用 partial 这么声明会将前两个参数固定,只需要传入第三个参数就行了。
一旦用了像ad = functools.partial(fun, b = 1)
这样的形式,则在调用fun函数时,b往后的参数需要加上对应的变量名:
def fun(x, y, z):
print('sum is', x + y + z)
ad(2, 3) #显示错误为 TypeError: fun() got multiple values for argument 'y'
ad(2, z = 3) #运行正确
即若不指定参数名,则默认的是从左边的参数开始赋值。
额外知识点
socket.socket()绑定的是一个随机的端口,使用bind()方法可以重新绑定。