一 列表生成式
1) 找出1~10之间所有偶数, 并且返回一个列表, (包含以这个偶数为半径的圆的面积)
mothed 1:
li = []
for r in range(2,11,2): #[2,4,6,8,10]
square = math.pi * r * r
li.append(square)
print(li)
但是看到:代码笨重, 这种类型建议改写为列表生成式
mothed 2:
列表生成式实现
可以看到一样的效果,但是列表生成式一行代码就搞定了
mothed 3:
列表生成式实现, 将要返回的操作抽象为一个函数
专门定义一个函数来计算圆的面积,再用列表生成式来一步生成列表
2) 找出1~10之间所有奇数, 并且返回一个列表, (所有的奇数转换为字符串)
3) 找出1~100之间所有奇数, 并且返回一个列表,(如果能被3整除, 返回该数的平方, 否则返回该数的三次方)
4) 给定一个列表li = [2,3,4,5,6,3,1,4,5](如果是偶数返回0, 如果是奇数返回1)
5)找出1~100之间所有的质数
质数:只能被1和本身整除的数, 就是质数
判断num是否为质数, 如果为质数, 返回True, 否则返回False
依次判断num能否被(2,num)整除,如果能被其中一个数整除,不是质数.
当循环结束, 都没有发现能被整除的数, 那么就是质数
6) 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
# [2,3,5,7]
-输入描述:输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:输出对数
- 示例1 :输入:10输出:2
二 矩阵转秩
实现矩阵转秩的两种方法:
1). 列表生成式
2). 内置函数zip
1)列表生成式:
print([[ row[columnIndex] for row in li] for columnIndex in range(5)]
columnIndex=0=====> 返回的是每一行的第0个索引值; [1,4,7]
以此类推
2)内置函数zip:
*li: 解包
zip:
1).打包函数, 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
2).如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表
3). zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。
如需展示列表,需手动 list() 转换。
三 字典生成式
1) 假设有20个学生,学生分数在60-100之间,筛选出成绩在90分以上的学生
1> 如果用以前的方法,代码量过于长了
import random
stuInfo={}
for i in range(20):
name = "westos"+ str(i)
score = random.randint(60,100)
stuInfo[name] = score
#筛选出score>90
highScore = {}
for name, score in stuInfo.items():
if score > 90:
highScore[name] = score
print(highScore)
2> 现在用集合生成式的话,代码量就会减少许多
import random
stuInfo = {"westos"+ str(i):random.randint(60,100)
for i in range(20)}
print({ name:score for name, score in stuInfo.items() if score > 90 })
2) 将字典的key值和value值调换
3) 大小写计数合并 : key值最终全部为小写
四 集合生成式
同列表一样,只是将[ ]变为了{ }
也同字典相同,只不过传的是一个参数
五 判断是否会for循环
导入 Iterable 来判断是否可以for 循环,如果可以,返回True,否则,为False
六 生成器
1)生成器最快实现的方式:通过列表生成式改写. 一边循环, 一边计算的机制
可以看到如果不next 输出的话,是不会有结果的,因为数据都在生成器里面,需要next 来进行输出
每 next 执行一次,就会算一次
八 yield
斐波那契数列:
指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,
610,987,1597,2584,4181,6765,10946,17711,28657,46368........
yield:当函数中包含yield关键字, 返回值是一个生成器, 如果要执行函数内容.需要调用next方法, 或者for循环.
运行过程: 当执行next方法时, 遇到yield程序停止, 直到执行下一次next方法时,
从上一次停止的yield处继续执行,遇到yield停止运行.
return: 遇到return函数执行结束;
九 生成器的原理
生成器fib( )执行的过程分析:
# 执行语句 f = fib(100) 时,并不会马上执行 fib() 函数的代码块,而是首先返回一个 iterable 对象(即生成器)!
# 在 for 循环语句执行时或者next(),才会执行 fib() 函数的代码块。
# 执行到语句 yield b 时,fib() 函数会返回一个迭代值,直到下次迭代前,
# 程序会回到 yield b 的下一条语句继续执行,然后再次回到 for 循环,如此迭代直到结束。
# 看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
# 由此可以看出,生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,
# 从而节省内存空间。
def myfun():
print('step1')
yield 'yield1'
print('step2')
res = yield 'yield2'
print('sheen',res)
print('step3')
yield 'yield3'
#1.函数中有yield,返回值是一个生成器
g = myfun()
print(g)
#2.生成器函数默认不执行函数内容,当有next(g)时,才会执行函数内容
#3. 执行函数时,遇到下一个yield停止。默认情况下不会显示yield后的语句内容
#next(g) #停在yield这个关键字位置
print(next(g)) #print会显示yield 这一句后面的内容
#仅有next和print(next)---->都在同一个yield语句行
#4.如果要给生成器函数传值
# 1)必须有变量接收传递的值:res = yield 'yield2'
# 2) 通过g.send('') ---->‘send’会重复上一次'yield'语句
print(next(g))
g.send('hello')
#print(next(g))
十 生成器——实现迷你聊天机器人
def chat_robot():
res=''
while True:
receive=yield res
if 'age' in receive:
res='年龄保密'
elif 'name' in receive:
res='siri'
elif 'hello' in receive:
res='hello'
else:
res="i don't know what you say"
def main():
Robot=chat_robot()
next(Robot)
while True:
send_data=input('正义: ')
if send_data == 'q' or send_data == 'bye':
print('bye')
break
print(Robot.send(send_data))
main()