列表生成式就是一個用來生成列表的特定語法形式的表達式。是Python提供的一種生成列表的簡潔形式, 可快速生成一個新的list。
普通的語法格式:[exp for iter_var in iterable]
帶過濾功能語法格式: [exp for iter_var in iterable if_exp]
循環嵌套語法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
比如 有下面的需求:
import string
import random
li = []
for i in range(100):
s = ''.join(random.sample(string.ascii_letters,4))
li.append(s)
print(li)
就可以用下面一行代碼搞定:
codes = [''.join(random.sample(string.ascii_letters,4)) for i in range(100)] ##將生成的字符串 存儲在列表中
print(codes)
同理,類似的需求
# nums = []
# for num in range(1,101):
# if num%3==0:
# nums.append(num)
# print(nums)
還是可以用一行代碼搞定
nums = [num for num in range(1,101) if num%3==0]
print(nums)
s= {i**2 for i in range(10)}
print(s)
d = {i:i**2 for i in range(10)}
print(d)
### 生成器實現的第一種方法: 將生成式改寫成生成器
nums = (i**2 for i in range(1000))
print(nums) ## 輸出generator
# 打印生成元素,方法一:逐個生成 下面的next表示逐個生成 用的時候再說
print(next(nums)) #0
print(next(nums)) #1
print(next(nums)) #4
print(next(nums)) #9
# 打印生成元素,方法二:for循環生成
for i in nums:
print(i)
### 生成器實現的第2種方法:yield關鍵字
# return: 函數遇到return就返回,return後面的代碼並不會執行。
# yield:遇到yield則停止執行代碼, 當再次調用next方法時,會從上次停止的地方繼續執行,遇到yield停止。
def login():
a = 1
return 'login'
# print(1) ## return之後的就不再執行了 所以這句話無效
print(login())
def login():
print('step1')
yield 1
print('step2')
yield 2
print('step3')
yield 3
g = login()
print(next(g))
**以下為輸出:**
step1
1
其特性如下:
# 1. 函數裡面嵌套函數
#2. 外部函數的返回值是內部函數的引用
#3. 內部函數可以使用外部函數的變量
##1. 函數裡面嵌套函數
# def tiemit():
# def warpper():
# print('warpper')
# print('timeit')
# tiemit()
輸出:
timeit
#2. 外部函數的返回值是內部函數的引用
def timeit():
def warpper():
print('warpper')
print('timeit')
return warpper
in_fun = timeit() ## wrapper函數, in_fun實質上就是wrapper函數
in_fun()
輸出:
timeit
warpper
#3. 內部函數可以使用外部函數的變量
# def timeit(name):
# def warpper():
# print('warpper'+name)
# print('timeit')
# return warpper
# in_fun = timeit(name='mananananan') ## wrapper函數, in_fun實質上就是wrapper函數
# in_fun()
輸出:
timeit
warppermananananan