目錄
- 0 上節課複習
- 0.1 迭代器
- 0.1.1 可迭代物件
- 0.1.2 迭代器物件
- 0.1.3 for迴圈原理
- 0.2 三元表示式
- 0.3 列表推導式
- 0.4 字典生成器
- 0.5 生成器
- 0.5.1 生成器表示式
- 0.6 遞迴
- 0.7 二分法
- 0.1 迭代器
- 1 匿名函式
- 1.1 有名函式
- 1.2 匿名函式
- 2 內建函式
- 2.1 掌握
- 2.2 瞭解
- 3 程序導向程式設計
0 上節課複習
0.1 迭代器
0.1.1 可迭代物件
擁有iter方法的物件
str / list / tuple / dict / set / file
0.1.2 迭代器物件
file
擁有iter和next方法的物件
- 迭代器物件一定是可迭代物件,可迭代物件不一定是迭代器物件(檔案是可迭代物件也是迭代器物件
0.1.3 for迴圈原理
for in list
:把list生成可迭代物件,然後使用next方法取出一個個值,直到報錯捕捉異常然後中斷退出,所以for迴圈可以不基於索引值
0.2 三元表示式
成立時幹嘛 if 條件 else 不成立幹嘛
0.3 列表推導式
[ i for i in range(10)]
0.4 字典生成器
{ i: i for i in range(10)}
0.5 生成器
自定義的迭代器,函式內使用yield關鍵字
yield: 接受函式返回值,但是會繼續執行下面的程式碼,使用yield關鍵字呼叫的函式變成生成器
return: 接受函式返回值,但會終止函式的執行,使用return關鍵字呼叫的函式就是一個普通的函式
0.5.1 生成器表示式
{i for i in range(10)}
生成器表示式生成的東西相當於老母雞,需要的時候next拿出來
列表推導式就是一筐雞蛋
0.6 遞迴
本質上就是函式呼叫本身,必須得有終止條件
0.7 二分法
lis = [i for i in range(10000)]
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
@deco
def find_num(num):
for i in lis:
if i ==num:
print('找到了')
break
else:
print('沒有被找到')
find_num(45678)
1 匿名函式
1.1 有名函式
有名字的函式。名字()呼叫
def mingzi():
pass
mingzi()
1.2 匿名函式
沒有名字的函式
lambda關鍵字定義,語法:
# lambda x,y(引數):x+y(程式碼)
f = lambda x,y:x+y #(不可這樣)
匿名函式也能呼叫,但是呼叫需要注意只能使用一次,匿名函式一般不單獨使用,而是與max(),min(),map(),sorted(),filter()這些內建函式一起使用
max() 求最大值
min() 求最小值
sorted() 排序,預設從小到大,需要接受
map() 對映:
map(lambda name:f'{name}dsb',name_list)
filter() 過濾
lis = ['sad dsb', 'dsadas dsb','sadsad']
res = filter(lambda x:x.endswith('dsb'),lis)
print(list(res)) # 輸出:['sad dsb', 'dsadas dsb']
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000
}
salary_max = max(salary_dict,key = lambda name:salary_dict(name))
print(salary_max)
2 內建函式
2.1 掌握
# 1.bytes()
print('中文'.encode('utf-8'))
print(bytes('中文'.encode('utf-8')))
# 2.chr()/ord() ascill碼對應關係
print(chr(98)) #輸出b
print(ord('a')) #輸出97
# 3.divmod(x,y) 整除 輸出 x//y x%y
print(divmod(10,3)) #(3, 1)
# 4.enumerate() 獲取索引和值
lis = ['a','b','c']
for i in enumerate(lis):
print(i) #輸出(0, 'a')(1, 'b')(2, 'c')
for index,value in enumerate(lis):
print(index,value) #輸出 0 a ;1 b ;2 c
# 5.eval() 去掉字串的引號,然後他是什麼資料型別就是什麼資料型別
lis = ' ["a","b","c"]'
print(lis)
print(type(lis))
print(eval(lis))
print(type(eval(lis)))
# 6.hash() 可雜湊不可變,不可雜湊可變
print(hash(1))
# hash([1,2,3]) #list為可變,故不可雜湊,會報錯
2.2 瞭解
# 1.abs() 求絕對值
print(abs(-10)) # 10
# 2.all() 可迭代物件內元素全為真,則返回真,括號裡只能有一個物件 類似於 and
print(all([1,2,3,4])) #True
print(all([0,1,4,7])) #Flase
# 3.any() 可迭代物件內元素有一個為真,則返回真,括號裡只能有一個物件 類似於 or
print(any([0,0,0,0])) #Flase
print(any([0,0,1,0])) #True
# 4.bin/oct/hex 二進位制,八進位制,十六進位制
print(bin(10)) # 0b1010
print(oct(10)) # 0o12
print(hex(10)) # 0xa
# 5.dir 列舉出math的所有功能
import math
print(dir(math))
# 6.frozenset() 不可更改的集合
s = frozenset({1, 2, 3})
print(s) #frozenset({1, 2, 3})
# 7. globals()/nonlocal() 檢視全域性名字;檢視區域性名字。
# 8.pow(x,y,z) (x**y)%z
print(pow(3, 2, 3)) # (3**2)%3
# 9.round() 四捨五入
print(round(3.5)) #4
# 10.sum() 求和
print(sum(range(100))) #4950
# 11.__import__() 透過字串匯入模組。
m = __import__('time')
print(m.time())
3 程序導向程式設計
原材料(一堆塑膠) \(\rightarrow\) 融化塑膠 \(\rightarrow\) 透過模具做出一個個瓶子 \(\rightarrow\) 包裝檢測瓶子 \(\rightarrow\) 賣瓶子
程序導向程式設計:按照一定的順序,順序中的每一步都可以看成函式,這個函式的輸入是上一個函式的輸出
- 優點:
- 邏輯清晰,簡單明瞭
- 每個函式可以獨立的寫出來
- 缺點:
- 相互之間會有一定的聯絡,上一步中斷了,下一步也中斷了
- 有一個功能改變了,其他的功能也要改變
- 可擴充套件性差
def enter_username_pwd():
username = input("請輸入你的名字>>>").strip()
pwd = input("請輸入你的密碼>>>").strip()
return username, pwd
def register():
username, pwd = enter_username_pwd()
with open('test.txt', 'a',encoding = 'utf8') as fa:
fa.write(f"{username}:{pwd}\n")
def login():
username, pwd = enter_username_pwd()
with open('test.txt', 'r',encoding = 'utf8') as fr:
for user in fr:
user_list = user.strip().split(':')
username_file = user_list[0]
pwd_file = user_list[1]
if username == username_file and pwd == pwd_file:
print('登陸成功!')
break
else:
print('登入失敗')
fun_dict = {
0:register,
1:login,
}
print_message = '''
0:register
1:login
q:quit
'''
print(print_message)
while True:
choice = input('請輸入你需要的功能').strip()
if choice == 'q':
break
fun_dict[int(choice)]()