一、迭代
In [2]: from collections import Iterable ##判断是否可迭代,需导入Iterable模块
In [3]: isinstance([1,2,3],Iterable)
Out[3]: True ##可for循环遍里的数据类型,均可迭代
In [4]: isinstance((1,2,3),Iterable)
Out[4]: True
In [5]: isinstance({‘a’:1,’b’:2},Iterable)
Out[5]: True
In [6]: isinstance(‘hello’,Iterable)
Out[6]: True
1
2
3
4
5
6
7
8
9
10
二、列表生成器
1.生成10以内数的平方的列表
In [1]: [i**2 for i in range(10)]
Out[1]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1
2
3
2.生成20以内4倍数的平方的列表
In [7]: def gener(num):
…: return num%4==0
…: ##函数,判断num是否为4的倍数
In [8]: [i**2 for i in range(20) if gener(i)]
Out[8]: [0, 16, 64, 144, 256]
1
2
3
4
5
6
7
3.练习:找出/etc下以.conf结尾的文件
In [10]: import os ##导入os模块
In [11]: [filename for filename in os.listdir(‘/etc’) if filename.endswith(‘.conf’)]
Out[11]: ##判断文件是否以’.conf’结尾
[‘resolv.conf’,
‘idmapd.conf’,
‘krb5.conf’,
…
In [12]: [filename for filename in os.listdir(‘/etc’) if filename.split(‘.’)[-1]==’conf’]
Out[12]: ##对字符串分割,筛选conf文件
[‘resolv.conf’,
‘idmapd.conf’,
‘krb5.conf’,
…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
升级:把找出的文件转化成大写
In [13]: [filename.upper() for filename in os.listdir(‘/etc’) if filename.endswith(‘.conf’)]
Out[13]: ##filename.upper()内置方法,转换大写
[‘RESOLV.CONF’,
‘IDMAPD.CONF’,
‘KRB5.CONF’,
…
1
2
3
4
5
6
4.找出N(输入的正整数)以内符合和等于N的质数对
方法1:直接生成质数列表
N = int(input(‘please input an int:’))
count = 0
l = [1, 2]
for i in range(3, N): ##判断是否为质数,并加入质数列表
for n in range(2, i):
if i % n == 0:
break
else:
l.append(i)
for num in l: ##判断是否质数对满足要求
if N - num in l and num <= N - num:
count += 1
print(count)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
方法2:采用列表生成器
N = int(input(‘please input an int:’))
count = 0
def prime(x): ##编写函数,判断是否为质数
if x <= 0:
return False
elif x == 1 or x == 2:
return True
else:
for num in range(2,x):
if x % num == 0:
return False
else:
return True
l=[i for i in range(N) if prime(i)] ##列表生成器
for num in l:
if N - num in l and num <= N - num:
count += 1
print(count)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
三、字典生成式
1.生成新的字典,要求key值变成大写,value值+1
service = {
‘http’: 80,
‘mysql’: 3306,
‘ssh’: 22
}
print({k.upper(): v + 1 for k, v in service.items()})
print({v: k for k, v in service.items()}) ##key-value值互换
1
2
3
4
5
6
7
2.对原字典处理,大小写合并,并以小写形式输出
方法1:采用遍历的方式
d = dict(a=2, A=1, B=10, b=4, e=3)
new_d = {}
for k, v in d.items():
k = k.lower() ##将元素转换为小写
if k in new_d: ##加入新字典中,整合
new_d[k] += v
else:
new_d[k] = v
print(new_d)
1
2
3
4
5
6
7
8
9
方法2:采用字典生成式:
注意:get的用法,查询到返回对应value值,查不到,返回None;修改默认值为0
d = dict(a=2, A=1, B=10, b=4, e=3)
print({k.lower():d.get(k.lower(),0)+d.get(k.upper(),0) for k in d})
1
2
3
3.集合生成式
找出字典中的偶数,并去重
d = dict(a=2, b=4, c=5, d=6, e=4)
print({v for k, v in d.items() if v % 2 == 0})
1
2
四、生成器
1.Generator:在循环的过程中,为了节省内存空间。在 Python 中,这种一边循环一边计算的机制
2.生成器的定义及调用 ##依次计算,只能从前往后
python3:
g = ( i for i in range(3))
g.next()
0
g.next()
1
g.next()
2
g.next() ##超出range报错
Traceback (most recent call last):
File “”, line 1, in
1
2
3
4
5
6
7
8
9
10
python2:
In [1]: g = (i for i in range(3))
In [2]: g.next() ##调用方法不一样
Out[2]: 0
In [3]: g.next()
Out[3]: 1
In [4]: g.next()
Out[4]: 2
In [5]: g.next()
StopIteration Traceback (most recent call last)
in ()
—-> 1 g.next()
StopIteration:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3.for循环的底层原理:
g=(i for i in range(3))
while True: ##当超出range范围时,停止
try:
print(g.next())
except StopIteration: ##异常处理机制
break
1
2
3
4
5
6
4.斐波那契数列
def fib(max):
a, b, count = 0, 1, 1
while count <= max:
# print(b) ##直接打印
yield b ##yield关键字,直接转换成genarator类型
a, b = b, a + b
count += 1
fib(8) ##直接调用函数,打印时会显示生成器类型
g=fib(8) ##定义生成器g
print(g.next()) ##依次计算斐波那契数列并输出
print(g.next())
1
2
3
4
5
6
7
8
9
10
11
12
13
yield原理:
1.函数中有yield,返回生成器对象,当前不执行
2.调用函数g._next_()时,遇到yield停止,输出yield后的值
3.再次调用函数g._next_()时,从yield后执行
5.简易交互式聊天(最简级别)
def robot(): ##定义对话机器人robot函数
responce = ” ##输出值
while True:
received = yield responce ##每次执行到yield时,输出response
if ‘name’ in received: ##识别输入的字符串
responce = ‘XXXL’ ##name关键字的返回结果
elif ‘age’ in received:
responce = ‘guess~~~~~’ ##age关键字的返回结果
elif ‘phone’ in received:
responce = ‘gun,gun fastly…..’ ##phone关键字的返回结果
else:
responce = ‘YOU GET OUT! Right Now~~~~’
def main(): ##定义主函数
Robot = robot() ##定义生成器
Robot.next() ##跳过,直接进入yield前状态
while True: ##对话的死循环
send_data = input(‘YOU>>:’) ##输入的信息
if send_data == ‘q’:
print(“I’m tired….”)
break
robot_data = Robot.send(send_data) ##send发送,yield接受
print(‘robot>>:’, robot_data)
main() ##调用函数,进入交互式问答界面