一、字元編碼
字元編碼:把人的字元翻譯成計算機能夠認識的數字。
字元編碼表:就是一張字元與數字對應關系的表。
例如:ascii、gbk、utf-8、unicode
unicode ----> encode('utf-8') ----> bytes
bytes ----> decode('utf-8') ----> unicode
python3中的字元串分為2種:
x='aa' #存成unicode
y=x.encode('utf-8') #此時轉存成bytes
unicode與bytes #python3預設是unicode
python2中的字元串也分為2種:
x=u'aa' #與python3的字元串概念一樣
y='bb' #與pyhton3的bytes一樣。
unicode與bytes
python3預設的格式就是unicode
總之一句話:字元以什麼格式編碼、就要以什麼格式解碼。
二、檔案的操作
1、r讀模式、檔案不存在的時候,不會建立檔案。
f = open('a.txt','r',encoding='utf-8')
print(f.read())
1.1 b模式: #此時不在需要制定編碼格式
f = open('a.txt','br')
f.close()
#指定字元解碼
f = open('a.txt','rb')
print(f.read().decode('utf-8'))
1、w寫模式、檔案存在清空檔案、不存在建立檔案。
f = open('a.txt','w')
f.write('111')
1.1、writeable 是否可寫
print(f.writable())
1.2、寫入一行:
f.writelines('1111\n22222222222')
1.3、a追加模式、檔案不存在建立、檔案存在跳到檔案末尾。
f = open('a.txt','a')
f.writelines('111a1\n22222222222')
1.3.1、檢視檔案的光标位置
print(f.tell()) #列印光标的位置,追加一般光标會到結尾處。
#打開檔案就會跳到檔案的結尾處、檔案不存在的時候會建立檔案。
總結:
檔案的操作方式中:讀隻能讀不能追加和寫入、寫隻能寫不能讀和追加、追加也隻追加,但這是預設的情況,如果需要在寫的時候讀或者在讀的時候寫請使用權限a+,r+,w+
檔案的操作方法中:隻有w和a在檔案不存在的情況下才會建立檔案。
1.4 rb模式、直接讀取bytes模式。
1.4.1 wb模式、直接寫入b模式,但是預設情況是不能直接寫入的、需要encode。
f = open('a.txt','wb')
f.write('aaaaa'.encode('utf-8'))
1.4.2 ab 模式需要加encode
需要注意的是:我們在檔案操作結束後執行的f.close()操作,其實是在作業系統層面上關閉了檔案,但是在程式中所定義的f = open()變量依然還是存在的。隻有del 變量 ,變量才會清除。也就是說檔案關閉了,但是方法依然存在,且方法不能執行!!!!
1.4、cpoy 檔案使用rb和wb
import sys
if len(sys.argv) < 3:
print('參數不夠!')
elif len(sys.argv) > 3:
print('參數不對!')
else:
with open(r'%s' %sys.argv[1],'rb') as read_f,open(r'%s' %sys.argv[2],'wb') as write_f:
for line in read_f:
write_f.write(line)
#使用rb模式就不在需要考慮編碼的問題了。
1.5 檔案的其他操作:檔案的操作read()預設是以字元為基礎,全部讀取,一次預設讀取一個字元。
f =open('a.txt','r')
f =open('a.txt','rb')
print(f.read(3).decode('utf-8'))
#一個中文漢字占3個字元位、如果在read過程中字元數如果不是3的倍數、會報錯,預設以位元組為機關讀取。
seek()控制光标的位置。預設以檔案開頭為參照.
0代表從頭開始,1代表目前位置,2代表檔案最末尾位置。
你好啊xiaoming
print(f.read(1))
print(f.tell())
f.seek(6)
你
3
啊
f.seek(6,0)
print(f.read(3))
f.seek(3,1)
b'\xe4\xbd\xa0'
6
啊xiaominghehe
seek 有3中模式。0 1 2
1和2模式必須在b模式下才可運作
0模式以檔案開頭
1模式以目前的光标為參照物
#模拟tailf 指令
import time
with open(r'%s' %sys.argv[2],'rb') as f:
f.seek(0,2)
while true:
line = f.readline()
if line:
print(line.decode('utf-8'),end='')
else:
time.sleep(0.3)
1.6 truncate 截取字元
with open('a.txt','r+',encoding='utf-8') as f:
f.truncate(9)
你好啊
#但是如果截取的字元少了,會出現亂碼的情況
如果檔案為空,截取為空格。
三、函數
随着程式的功能越多、代碼的複雜度也越來越大、組織結構不清晰、可讀性較差。
代碼的備援和可擴充性差。工具即函數、使用即調用。
1、函數的分類:
1、内置函數
len() print() max() ……
2、自定義函數
2、函數的使用:
1、先定義函數{定義函數隻是檢查文法、不執行代碼}
2、在調用函數
函數的定義與變量的定義類似、沒有事先定義變量、而直接引用變量,會報錯。
沒有事先定義函數、而直接調用函數、就相當于引用一個不存在的變量名。
3、函數的定義:
def 函數名(arg1,arg2,arg3):
'''注釋'''
函數體
return 傳回值沒有類型的限制、return可以有多個、但是隻會執行一次、并且将return後面的結果傳回。沒有return 傳回none。
有參函數都需要傳回值、無參函數一般不需要傳回值。
函數的調用可以當做其他函數的參數。
函數名:一般是動詞、注釋資訊一定要有
參數 。。。。
4、定義函數的三種形式:
1、無參函數:僅僅用來執行一些操作、比如使用者互動、列印。
2、有參函數:需要外部傳進來的參數、才能執行相關的邏輯。
3、空函數:設計代碼的結構。
5、函數的參數分為實參和形參。
實參會占用記憶體空間,形參不占用記憶體空間。
形參就是變量名:實參就是變量值。
函數在調用階段實參才會綁定形參。
6、參數的分類;
1、位置參數:位置按照從左到右的順序依次定義的參數。
位置形參:定義變量
位置實參:與形參一一對應
文法規定:位置實參必須在關鍵字實參的前面。
同一個形參不能傳多次值。
2、關鍵字實參:指名道姓給name傳值、name=value
3、預設形參:在定義階段就已經為形參指派、意味着在調用階段可以不用傳值。
def foo(x,y=11111):
print(x)
print(y)
foo(1,'a')
預設參數必須放在位置參數之後。預設參數隻在定義階段指派一次、而且隻是一次。
預設參數的值應該定義成不可變的類型。****
7、可變長參數是指實參的個數不固定。
實參分為位置實參與關鍵字實參2種。
形參必須要有2中機制來分别處理按照位置定義的實參溢出的情況:*
按照關鍵字定義的實參溢出的情況**
溢出的參數按位置交個*處理、并且會将這些溢出的參數指派給args
如果沒有溢出的情況,args傳回一個空元組。
def foo(x,y,*args):
print(x)
print(y)
print(args)
foo(1,2,3,4,5,6,7)
def foo(x,y,**kwargs):
foo(x=1,y=2,z=3)
1
2
{'z': 3}
#關鍵字溢出會将溢出的參數放到一個字典中儲存。
*代表位置參數,
在*後面定義的形參成為關鍵字參數、必須以關鍵字形參形式傳參。
*後面的形參必須要關鍵字傳參。
def foo(name,age,*,sex='male',group):
print(name)
print(age)
print(sex)
print(group)
foo('zs',111,group='sc',sex='male')
zs
111
male
sc
*agrs 與**kwargs 聯用。
def foo(name,age=100,*args,sex='male',group,**kwargs):
**代表關鍵字參數
一個參數不能指派2次。!!
*args 擴充方法:
foo(1,5,*(1,3,4,5))
5
(1, 3, 4, 5)
def foo(x,y):
foo(*(4,5))
4
函數是第一類的對象:指的是函數可以被當做資料傳遞。
函數可以當做函數的傳回,可以當做容器類型的元素。
@補充python格式化字元串
格式 描述
%% 百分号标記 #就是輸出一個%
%c 字元及其ascii碼
%s 字元串
%d 有符号整數(十進制)
%u 無符号整數(十進制)
%o 無符号整數(八進制)
%x 無符号整數(十六進制)
%x 無符号整數(十六進制大寫字元)
%e 浮點數字(科學計數法)
%e 浮點數字(科學計數法,用e代替e)
%f 浮點數字(用小數點符号)
%g 浮點數字(根據值的大小采用%e或%f)
%g 浮點數字(類似于%g)
%p 指針(用十六進制列印值的記憶體位址)
%n 存儲輸出字元的數量放進參數清單的下一個變量中
%格式化符也可用于字典,可用%(name)引用字典中的元素進行格式化輸出。
負号指時數字應該是左對齊的,“0”告訴python用前導0填充數字,正号指時數字總是顯示它的正負(+,-)符号,即使數字是正數也不例外。
可指定最小的字段寬度,如:"%5d" % 2。也可用句點符指定附加的精度,如:"%.3d" % 3。
e.g.
# 例:數字格式化
nyear = 2018
nmonth = 8
nday = 18
# 格式化日期 %02d數字轉成兩位整型缺位填0
print '%04d-%02d-%02d'%(nyear,nmonth,nday)
>> 2018-08-18 # 輸出結果
fvalue = 8.123
print '%06.2f'%fvalue # 保留寬度為6的2位小數浮點型
>> 008.12 # 輸出
print '%d'%10 # 輸出十進制
>> 10
print '%o'%10 # 輸出八進制
>> 12
print '%02x'%10 # 輸出兩位十六進制,字母小寫空缺補零
>> 0a
print '%04x'%10 # 輸出四位十六進制,字母大寫空缺補零
>> 000a
print '%.2e'%1.2888 # 以科學計數法輸出浮點型保留2位小數
>> 1.29e+00
格式化操作符輔助指令
符号 作用
* 定義寬度或者小數點精度
- 用做左對齊
+ 在正數前面顯示加号( + )
<sp> 在正數前面顯示空格
# 在八進制數前面顯示零('0'),在十六進制前面顯示'0x'或者'0x'(取決于
用的是'x'還是'x')
0 顯示的數字前面填充‘0’而不是預設的空格
% '%%'輸出一個單一的'%'
(var) 映射變量(字典參數)
m.n m 是顯示的最小總寬度,n 是小數點後的位數(如果可用的話)
以下是一些使用格式字元串的例子:
十六進制輸出:
>>> "%x" % 108
'6c'
>>>
>>> "%#x" % 108
'0x6c'
浮點數和科學記數法形式輸出:
>>> '%f' % 1234.567890
'1234.567890'
>>> '%.2f' % 1234.567890
'1234.57'
>>> '%e' % 1234.567890
'1.234568e+03'
>>> '%g' % 1234.567890
>>> "%e" % (1111111111111111111111l)
'1.111111e+21'
整數和字元串輸出:
>>> "%+d" % 4
'+4'
>>> "%+d" % -4
'-4'
>>> "we are at %d%%" % 100
'we are at 100%'
>>> 'your host is: %s' % 'earth'
'your host is: earth'
>>> 'host: %s/tport: %d' % ('mars', 80)
'host: mars port: 80'
>>> num = 123
>>> 'dec: %d/oct: %#o/hex: %#x' % (num, num, num)
'dec: 123/oct: 0173/hex: 0x7b'
>>> "mm/dd/yy = %02d/%02d/%d" % (2, 15, 67)
'mm/dd/yy = 02/15/67'
>>> w, p = 'web', 'page'
>>> 'http://xxx.yyy.zzz/%s/%s.html' % (w, p)
'http://xxx.yyy.zzz/web/page.html'