2018-11-27 python學習第十天

強調:只有t模式下read(n),n代表字符個數,除此以外都是以字節爲單位

with open('a.txt',mode='rt',encoding='utf-8') as f:

res=f.read(4) #字符就是一個漢字爲一個字符, 字節就是一個漢字爲三個字節,一個英文單詞爲一個字節

print(res)

with open('a.txt',mode='rb') as f:

res=f.read(3)

print(res.decode('utf-8')) #因爲是b二進制所以要轉碼,這裏用到decode轉碼

with open('a.txt',mode='at',encoding='utf-8') as f:

f.truncate(3)

f.seek():指針移動是以字節爲單位的

三種模式:只有0模式既可以在t下用也可以在b下用,而1、2兩種模式只能在b模式下使用

0(默認的):參照文件開頭

with open('a.txt',mode='rt',encoding='utf-8') as f:

f.seek(3,0) #在3個字節後打印出信息

print(f.tell()) #tell是統計光標在哪裏開始運行

print(f.read())

1: 參照指針當前所在的位置

with open('a.txt',mode='rb') as f:

f.read(2) #這裏是2個字節,因爲用到的b

f.seek(4,1)

print(f.tell()) #tell這裏的指針是在6個字節後運行,2+4 =6個字節

print(f.read().decode('utf-8'))

2: 參照文件末尾

with open('a.txt',mode='rb') as f:
f.seek(-5,2) #-5就是光標在尾巴處,往前退5個字節
print(f.tell()) #這裏光標顯示爲9是因爲是-5,後退5個字節,光標所以在爲3個字符後面就是9個字節
print(f.read().decode('utf-8')) #當碰到b 就需要decode轉義下

tail -f access.log

import time

with open('access.log',mode='rb') as f:
f.seek(0,2) #0就是從頭開是,2就是參照尾部
while True:
line=f.readline()
if len(line) == 0: #統計line的個數,如果爲空
time.sleep(0.1) #讓系統睡0.1秒
else:
print(line.decode('utf-8'),end='')

'''

  1. 什麼是函數
    在程序具備某一功能的工具=》函數
    事先準備好工具=》函數的定義
    遇到應用場景、拿來就用=》函數的調用

    分爲兩大類:

    1. 內置函數
    2. 自定義函數
  2. 爲何要用函數

    1. 代碼冗餘
    2. 程序的組織結構不清晰,可讀性差
    3. 擴展性差
  3. 如何用函數
    函數的使用必須遵循一個原則:

    1. 先定義
      定義語法:
      def 函數名(參1,參2,參3,...):
      """
      文檔註釋
      """
      代碼1
      代碼2
      代碼3
      ...
      return 值

    2. 後調用
      函數名()

'''
#一. 定義階段: 只檢測語法,不執行代碼

def func():

print('from func 1')

print('from func 2')

print('from func 3')

print('from func 4')

#二. 調用階段: 開始執行函數體代碼

func()

func()

func()

示範一:

def foo():

print('from foo')

bar() #這裏bar沒定義所以執行錯誤

#

foo()

示範二:

def bar():

print('from bar')

#

def foo():

print('from foo')

bar()

#

foo()

#示範三:

定義

def foo():

print('from foo')

bar()

#

def bar():

print('from bar')

調用

foo() #這裏不會報錯,因爲定義是全部定義好之後在執行foo()

三:定義函數的三種形式

1. 無參函數

def func():

print('from func')

#

func() #什麼是無參函數,就是直接打印,不需要任何東西,func(),括號內是空的這個就是無參函數

2. 有參函數

def max2(x,y):

x=1

y=2

if x > y:

print(x)

else:

print(y)

#

max2(1,2) #有參還是就是(x,y)這個就是有參數,調用函數給你2個值

max2(3,4)

3. 空函數

def register(): #空函數主要用到的就是構建一個框架

pass

四:調用函數的三種形式

1 語句形式

def func():

print('from func')

#

func() #就給你一段話完畢

2 表達式形式

def max2(x,y):

if x > y:

return x

else:

return y

#

res=max2(1000,2000) * 12

print(res) #表達式函數就是讓return給你一個返回值,讓你去調用這個返回值

#

res=len('hello') #其實len就是在調用系統內部函數

print(res)

3 函數的調用可以當作另外一個函數的參數傳入

def max2(x,y):

if x > y:

return x

else:

return y

#

res=max2(max2(1,2),3) #這裏是函數的return的返回值在調用函數,

print(res)

            #首先x=1,y=2 取得2,然後res=max2(2,3)  在進行調用,x=2,y=3 取得3

'''

  1. 什麼是函數的返回值
    返回值是函數體代碼的運行成果

  2. 爲何要有返回值
    需要拿到函數的處理結果做進一步的處理,則函數必須有返回值

  3. 如何用
    return 返回值的特點:

    1. 返回的值沒有類型限制,也沒有個數限制
      I: return或者函數沒return:返回值None
      II: return 值:返回的就是該值本身
      III: return 值1,值2,值3:返回元組(值1,值2,值3)

    2. return是函數結束運行的標誌,函數內可以有多個return,但只要執行一次函數就立即結束,並且將return後的值當作本次調用的結果返回

'''

def func():

return 1,1.2,'aaa',[1,2,3] #這裏return的返回值是(1, 1.2, 'aaa', [1, 2, 3]),可以是多個值

pass #pass 這裏的return的返回值是none

res=func()

print(res)

def func():
print('aaaa')
return 1
print('bbb')
return 2
print('ccc')
return 3

res=func() #這裏說明,return至返回第一個return,後面2個return就不會執行了,只執行第一個
print(res)

一 函數的參數分爲兩大類:

1. 形參:在定義函數時括號內指定的參數(變量名),稱之爲形參

2. 實參:在調用函數時括號內傳入的值(變量值),稱之爲實參

二者的關係:在調用函數時,實參值(變量值)會傳給形參(變量名),這種綁定關係在調用函數時生效,調用結束後解除綁定

def func(x,y): #這行代碼就是形參

#x=1
#y=2
# print(x,y)#

func(1,2) #這行代碼就是實參

print(x)

a=1

b=2

func(a,b) #這行代碼就是實參

二:函數參數詳解

1. 形參:

1.1 位置形參:在定義階段,按照從左到右的順序依次定義的形參

特點:必須被傳值

def func(x,y,z): #括號內有內容就是位置形參,這裏是x,y,z 所以就是位置形參

print(x,y,z)

func(1,2,3) #這行就是位置實參

func(1,2,3,4) #這行就是位置實參,位置實參不能超過位置形參的個數,不然就報錯

func(1,2,) #這行就是位置實參,位置實參不能少於位置形參的個數,不然就報錯

1.2 默認參數:在定義階段,就已經爲某個形參賦值,該形參稱之爲默認形參

特點:在定義階段就已經有值,意味着調用階段可以不用爲其傳值

注意點:位置形參必須放在默認形參的前面

def func(x,y=2): #這裏因爲有y=2,所以這裏就是默認形參

print(x,y)

func(1) #因爲這裏是默認形參,所以實參就可以傳遞一個參數

func(1,3333333) #因爲這裏是默認形參,但是還是可以改默認形參的值

def register(name,age,sex='male'):

print(name,age,sex)

#

register('靚仔',18,)

register('小紅',28,)

register('小黑',38,)

register('花姑娘',16,'female')

def func(y=2,x): #因爲默認形參,不能在位置形參前面,所以肯定會報錯

print(x,y)

#1.3 形參中*與**的用法

1. 形參中帶會將溢出的位置實參存成元組的形式然後賦值其後變量名

def func(x,y,*args):

print(x,y,args) #這裏x=1,y=2, args=(3, 4, 5, 6) 因爲實參多出來了,只能用元祖形式顯示給形參

#

func(1,2,3,4,5,6)

2. 形參中帶會溢出的關鍵字實參存成字典的格式然後賦值其後變量名

def func(x,y,**kwargs):

print(x,y,kwargs) #這裏因爲用了2個*,所以kwargs爲{'z': 3, 'm': 1, 'n': 2} 這裏用字典存着

#

func(1,y=2,z=3,m=1,n=2)

2. 實參

2.1 位置實參: 在調用階段,按照從左到右的順序依次傳入的值

特點:這種傳值方式會與形參一一對應

func(2,1,3) #位置實參就是一一對應,改變位置,這裏位置形參的值也會發生改變

2.2 關鍵字實參: 在調用階段,按照key=value的格式傳值

特點:可以完全打亂位置,但仍然能爲指定的形參傳值

func(z=3,y=2,x=1) #這裏是關鍵詞實參,可以改變位置的,但是結果還是一樣的

注意:可以混用關鍵字實參與位置實參,但是

1. 同一個形參只能被賦值一次

2. 位置實參必須跟在關鍵字實參的前面

func(1,z=3,y=2) #這個是正確的做法,因爲x=1,y=2,z=3

func(1,z=3,y=2,x=333) #這裏也是錯誤的,因爲x=1已經被賦值過了,再次賦值肯定會報錯

func(x=1,2,z=3) # 報語法錯誤,因爲默認實參不能跟在關鍵詞實參後面

#2.3 實參中*與**的用法

1. 實參中帶*:先將實參打散成位置實參,然後再與形參做對應

def func(x,y,z):
print(x,y,z)

#func(1,[2,3]) #報錯,因爲少了一個z的實參

func([1,2,3]) #func(1,2,3) #用了的實參就是吧作爲位置實參來看待,不會改變裏面實參的位置

#func(*'hello') #func('h','e','l','l','o') #這裏會報錯,因爲你給你位置形參太多的值了,超過3個了

func(*'hel') #func('h','e','l') #這裏給三個值,所以x=h,y=e,z=l

2. 實參中帶**:先將實參打散成關鍵字實參,然後再與形參做對應

def func(x,y,z):

print(x,y,z)

#

func(**{'x':1,'z':3,'y':2}) #func(z=3,y=2,x=1) #就把他當初位置實參看待就行了

def index(x,y,z):

print(x,y,z)

#

def wrapper(*args,**kwargs): # args=(1,2,3,4,5) kwargs={'c':3,'b':2,'a':1}

index(*args,*kwargs) #index((1,2,3,4,5),**{'c':3,'b':2,'a':1}) #index(1,2,3,4,5,a=1,b=2,c=3)

index(1,z=3,y=2)

wrapper(1,2,3,4,5,a=1,b=2,c=3)

#

wrapper(1,z=3,y=2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章