input--out---correction(輸入輸出正確)
***第一模塊回顧
byte類型:數據存到硬盤,硬盤只能存儲2進制。
gbk/utf-8--->>decode(解碼)--->>unicode
Unicode--->>encode(編碼)--->>gbk/utf-8(2進制)
文字--》utf-8/gbk-->>2進制
圖片--》jpg/png-->>2進制
音樂--》mp3/wav-->>2進制
視頻--》mp4/mov-->>2進制
bytes類型,以16進制形式表示,2個16進制數(如0x e 5)構成一個byte(字節),
以‘b’來標識
1byte = 8bit
python3文件的默認編碼是utf-8(pycharm默認加載文件都是用utf-8編碼)
eg:f = open('bytes.txt','w',encoding='gbk') # 自己指定編碼
eg:f = open('bytes.txt','wb') # 以2進制模式就不用指定編碼
‘wb’-----二進制寫(必須是二進制)
‘w’------文件寫(必須是字符串)
python按你指定的編碼來編成2進制
總結 : 1,字符存硬盤 要變成bytes
2,網絡傳輸 字符要變成bytes類型
**深淺copy
dict,list,set,(和變量賦值指向不一樣)
s = {'name' : 'alex', .....}
s2 = s ,此時s2和s是共享 同一份數據的(指向同一個內存地址(杯子)),
s,s2改dict,list,set里面的任一元素會同時改。
深淺copy(借助copy模塊)
s.copy,淺copy(只復制第一層)復制一份數據,
只能改第一層的(第一層獨立),里面的嵌套斷線的數據改了會同時變
s.deepcopy,深copy,所有層都完全獨立。
**編碼轉換
>>> s
'你好未來'
>>> s.encode('utf-8') #編碼,以utf-8編碼成2進制
b'\xe4(2個16進制數)\xbd\xa0\xe5\xa5\xbd\xe6\x9c\xaa\xe6\x9d\xa5'#12個字節
>>> s_utf8 = s.encode('utf-8')
>>> s_utf8
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe6\x9c\xaa\xe6\x9d\xa5'
>>> s_utf8.decode('utf-8') #以utf-8格式解碼,也可以不寫,就會以python3默認的utf-8
'你好未來'
**編碼與解碼(以utf-8格式編碼的就必須用utf-8解碼,不然會報錯)
gbk/utf-8--->>decode(解碼)--->>unicode
Unicode--->>encode(編碼)--->>gbk/utf-8(2進制)
s.encode('utf-8')-->>以utf-8格式編碼成2進制
s.dncode('utf-8')-->>從2進制解碼成unicode str
**編碼的轉換:把文字從一種編碼轉成另外一種,比如,從gbk轉成utf-8
Unicode:萬國碼,跟所有的編碼之間有映射關系
>>> s
'你好未來'
>>> s.encode('utf-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe6\x9c\xaa\xe6\x9d\xa5'
>>> s
'你好未來'
>>> s.encode('gbk')
b'\xc4\xe3\xba\xc3\xce\xb4\xc0\xb4'
>>> s_gbk = s.encode('gbk')
>>> s_gbk.decode('gbk')
'你好未來'
>>> s_gbk.decode('gbk').encode('utf-8') #gbk轉換為utf-8
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe6\x9c\xaa\xe6\x9d\xa5'
2進制模式:rb wb ab
r 文本模式,把2進制解碼成str,Unicode
**函數
特性:1,減少重復 2,使程序易擴展 3, 使程序易維護
返回值(return),意味着函數的中止
def register(name, age, major, country = 'CN',*args,**kwargs): # 這里country是默認參數
info = """
--------你的注冊信息---------
name: %s
age: %s
major: %s
country: %s
""" % (name,age,major, country)
print(info)
register('alex', 22, 'cs')
register('al', 22, 'math')
register('ax', 22, 'us', 'US')
函數的參數: 形參和實參
函數參數的優先級:位置參數 > 默認參數/關鍵參數
函數外部的代碼要想獲取函數的執行結果,就可以在函數里用return
語句把結果返回。
def stu_register(name, age, course = 'PY', country = 'CN'):
print('-----注冊學生信息-----‘)
print('Name:', name)
print('Age:', age)
print('Country:', country)
print('Course:', course)
if age > 22:
return False
else:
return True
registriation_status = stu_register('alex', 22, course='PY', 'CN')
if registriation_status:
print('注冊成功’)
else:
print('too old to be a student.')
*注意:1.函數在執行過程中,只要遇到return語句,就會停止執行並返回結果,所以
也可以理解為return語句代表函數的結束。
2.如果未在函數中指定return,那這個函數的返回值為None
函數返回多個值
def test():
return 1,2,3,4,5 # 返回多個值會以tuple包起來
print(test())
**全局變量和局部變量 (locals()方法,打印所有的局部變量
globals()方法,打印所有的全局變量)(從局部變量》嵌套變量》全局變量)
name = 'alex' # 全局變量
def change():
name = '金角大王' #局部變量
global name # 在函數內部聲明(創建)一個全局變量
print(name)
print(locals())
print(globals())
change()
print(name)
**函數傳遞列表,字典,集合時發生的現象
d = {'name':'alex', 'age':28, 'hobby':'dabaojian'}
l = ['rebeeca', 'katrina', 'rachel']
def change_data(info, girls):
info['hobby'] = 'study'
girls.append('xiaoyun')
change_data(d,l)
print(d,l)## dic,li 這個內存地址沒有變,只是里面的元素變了
結果為d 為{'name': 'alex', 'age': 22, 'hobbie': 'study'}
l為['Rebeeca', 'Katrina', 'Rachel', 'xiaoyun']
**嵌套函數,匿名函數和高階函數
嵌套函數 name = '小猿圈'
def change():
# name = '小猿圈,自學編程'
def change2():
#global name 如果聲明了這句,下面的name改的是最外層的全局變量
# name = '小猿圈,自學編程,不要錢'
print('第3層打印', name)
change2() # 調用內層函數
print('第2層打印', name)
change()
print('最外層打印',name)
匿名函數
c = lambda x,y:x**y
print(c(2,8))
與下面的代碼等價:
def calc(x, y):
return x**y
print(calc(2, 8))
例子: def calc(x):
return x**2
#res = map(calc, [1,2,3,4,5,6])
res = map(lambda x:x**2,[1,2,3,4,5,6])#lambda函數中最多加一個三元運算
print(res)
for i in res:
print(i)
高階函數:1,接收一個或者多個函數作為輸入 2,return返回另外一個函數
def get_abs(n):
if n < 0:
n = int(str(n).strip('-'))
return n
def add(x,y,f):
return f(x) + f(y)
res = add(3, -6, get_abs)
print(res)