Page one : python基础
1.请注意,保存数据时绝对不能用Word和Windows自带的记事本。Word保存的不是纯文本文件,而记事本会自作聪明地在文件开始的地方加上几个特殊字符(UTF-8 BOM),结果会导致程序运行出现莫名其妙的错误。
2.Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里
3.python3除法定义
"/" 除法计算结果是浮点数
"//",称为地板除,两个整数的除法仍然是整数
4.只有1个元素的tuple定义时必须加一个逗号‘,’,来消除歧义
>>> t = (1,)
>>> t
(1,)
5.“非零数值、非空字符串、非空list等”== True,否则为False
6.数据类型检查可以用内置函数isinstance()实现
7.定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> calc()
0
8.for循环作用在可迭代对象上
collections模块的Iterable可判断对象是否可迭代。
python内置的isinstance(data, data_type)方法判断数据是否为给定的数据类型
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
9.enumerate()函数可以把一个list变成索引-元素对
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
10.列表生成式(List comprehension)是Python内置的非常简单却强大的可以用来创建list的生成式
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来
>>>[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]
用两层循环,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
11.生成器(generator),一边循环一遍计算出后续的元素
create method1:把一个列表生成式的[]改成()
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
通过next()函数可以获得生成器的下一个返回值
>>> next(g)
0
>>> next(g)
1
>>> for i in g:
>>> print(i)
create method2:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a+b
n += 1
return 'done'
调用generator时,首先生成一个generator对象,然后用next()函数不断获得下一个返回值
def odd():
print 'step1'
yield 1
print 'step2'
yield(3)
print 'step3'
yield(5)
>>> o = odd()
>>> next(o)
step1
1
>>> next(o)
step2
3
>>> next(o)
step3
5
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
odd不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。执行3次yield后,已经没有yield可以执行了,所以,第4次调用next(o)就报错。
但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
>>> for n in fib(6):
... print(n)
...
1
1
2
3
5
8
>>> g = fib(6)
>>> while True:
... try:
... x = next(g)
... print('g:', x)
... except StopIteration as e:
... print('Generator return value:', e)
... break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
12.迭代器
iter()函数可实现将可迭代对象Iterable(聚集对象list,tuple,set,str,dict)转换为迭代器iterator(数据流,提前不可知数据长度,不断调用next()返回值);
python的for循环本质上通过不断调用next()函数实现
iterator是惰性的,只有在需要返回下一个数据时它才会进行计算
for x in range(10):
pass
it = iter(list(range(11)))
# 循环
while True:
try:
x = next(it)
except StopIteration:
break