天天看點

python 第三節

一、字元編碼

字元編碼:把人的字元翻譯成計算機能夠認識的數字。

字元編碼表:就是一張字元與數字對應關系的表。

例如: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'