1. 程式人生 > >python學習之路day03

python學習之路day03

本節內容

1. 函式基本語法及特性

2. 引數與區域性變數

3. 返回值

巢狀函式

4.遞迴

5.匿名函式

6.函數語言程式設計介紹

7.高階函式

8.內建函式

1. 集合

主要作用: 

  1. 去重
  2. 關係測試, 交集\差集\並集\(對稱)差集:&、-、|、^
list_1=set([1,3,5,6,7,9])
list_2=set([0,2,6,88,9,])

print(list_1.intersection(list_2)) #交集
print(list_1.union(list_2)) #並集
print(list_1.difference(list_2)) #差集
print(list_2.difference(list_1)) #差集
print(list_1.symmetric_difference(list_2)) #對稱差集

list_3=set([1,3,5])
print(list_1.issuperset(list_3)) #父集
print(list_3.issubset(list_1)) #子集

print(list_1&list_2) #交集
print(list_1|list_2) #並集
print(list_1^list_2) #對稱差集
print(list_1-list_2) #差集

list_1.add(999)

# list_1.pop()
print(list_1)

list_1.update([111,222,333])
print(list_1)
2.檔案操作

2.1檔案讀寫
#data=open("yesterday",encoding="utf-8").read()

# f=open("yesterday",encoding="utf-8")
# data=f.read()
# data2=f.read()
# print(data)
# print("-----data2--------",data2)

'''f=open("yesterday","r",encoding="utf-8") #r:讀(read);w:寫(write);a:追加(append);r+:讀寫;w+:寫讀;a+:追加寫;rb:e二進位制
# f.write("\n我愛北京天安門\n")
# f.write("\n when i was young,i would listen to the redio\n")
# f.close()

# for i in range(5):
# print(f.readline())
print(f.tell())
print(f.readline().strip())
print(f.readline().strip())
print(f.readline().strip())
print(f.tell())
f.seek(10)
print(f.readline().strip())
print(f.encoding)
print(f.fileno())
print(f.flush())
print(f.buffer)
'''

'''f=open("yesterday","a",encoding="utf-8")
f.seek(20)
f.truncate(20)
'''
'''f=open("yesterday","r+",encoding="utf-8") #讀寫(r+)
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell())
f.write("========diao======")
print(f.readline())
'''
'''f=open("yesterday","w+",encoding="utf-8") #寫讀(w+)
f.write("---diao----1\n")
f.write("---diao----2\n")
f.write("---diao----3\n")
print(f.tell())
f.seek(10)

f.write("should bea at the beging of the secound line ")
print(f.readline())
'''
f=open("yesterday","wb") #檔案控制代碼 二進位制檔案
# print(f.readline())
# print(f.readline())
# print(f.readline())
f.write("hello binary\n".encode())
f.close()
2.2檔案內容修改

f=open("yesterday","r",encoding="utf-8")
f_new=open("yesterday3","w",encoding="utf-8")

for line in f:
if "當我輕狂年少" in line:
line=line.replace("當我輕狂年少","當Alex輕狂年少")
f_new.write(line)
f.close()
f_new.close()

with語句

為了避免開啟檔案後忘記關閉,可以通過管理上下文,即:

with open('log','r') as f:

如此方式,當with程式碼塊執行完畢時,內部會自動關閉並釋放檔案資源。

在Python 2.7 後,with又支援同時對多個檔案的上下文進行管理,即:

with open('log1') as obj1, open('log2') as obj2:

3.字元編碼與轉碼

需知:

1.在python2預設編碼是ASCII, python3裡預設是unicode

2.unicode 分為 utf-32(佔4個位元組),utf-16(佔兩個位元組),utf-8(佔1-4個位元組), so utf-16就是現在最常用的unicode版本, 不過在檔案裡存的還是utf-8,因為utf8省空間

3.在py3中encode,在轉碼的同時還會把string 變成bytes型別,decode在解碼的同時還會把bytes變回string

 

編碼之間轉換

#-*-coding:gbk-*-
import sys
print(sys.getdefaultencoding())

s="你好,世界"

print(s.encode("gbk"))
print(s.encode("utf-8"))
print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
4.函式與函數語言程式設計
4.1程式設計方法:
1.面向物件:華山派--》類----》class
2.面向過程:少林派--》過程----》def
3.函數語言程式設計:逍遙派--》函式----》def
4.2python中函式定義的方法:
def text(x):
"the function defi
ntions...."
     x+=1
return x
4.3為什麼要使用函式
1.程式碼重複利用
2.保持資料的一致性
3.
使程式變的可擴充套件
4.使程式變得可維護
import sys,time

def logger():
time_formate="%Y-%m-%d %X"
time_current=time.strftime(time_formate)
with open("a.txt","a+") as f:
f.write("%s end action\n"%time_current)
def test1():
print("in the test1")
logger()
def test2():
print("in the test2")
logger()
def test3():
print("in the test3")
logger()
test1()
test2()
test3()
4.4函式返回值
def test1():
print("in the test1")
def test2():
print("in the test2")
return 0
def test3():
print("in the test3")
return 1,"hello world",["alex","fengjie"],{"name":"alex"}
x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z)
總結:返回值=0,返回None
返回值=1,返回object
返回值>1,返回tuple
4.5引數:形參和實參
1、形參與實參的定義和二者區別
形參:形式引數,不是時間存在,是虛擬變數,在定義函式的時候用形參,目的咋函式呼叫的時,接收時間引數的值(型別與實參一一對應)
實參:實際引數,呼叫函式時,傳給形參,不能形參傳給實參
區別:形參是虛擬的,不佔記憶體空間,形參變數只要在被呼叫時才分配記憶體單元;實參是一個變數,佔用記憶體空間,資料傳送單向,實參傳給形參,不能形參傳給實參
2、位置引數和關鍵字(標準呼叫:形參與實參位置一一對應;關鍵字呼叫:位置無需固定)
def test(x,y,z):
print(x)
print(y)
print(z)
test(1,2,6)
3、預設引數:呼叫函式的時候,預設引數非必傳遞
4、引數組:*args,**kwargs 位置放在最後面
# def test(x,y,z):
# print(x)
# print(y)
# print(z)
# test(1,2,6)
def test1(name,*args):
print(name)
print(args)
test1("alex",(1,2,3,4,5))

def test2(name,age=18,*args):
print(name)
print(age)
print(args)
test2("Jack",23,[1,2,3,4,5,6,7])

def test3(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
test3("rose",25,(1,3,5,7,9),sex="M",hobby="baskeball and tesla")
5.區域性變數和全域性變數:只在函式中失效
      在子程式中定義的變數稱為區域性變數,在程式的一開始定義的變數稱為全域性變數。      全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。      當全域性變數與區域性變數同名時:      在定義區域性變數的子程式內,區域性變數起作用;在其它地方全域性變數起作用。
5.1區域性變數
school="oldboy Edu."
def change_name(name,school):
print("before name",name,school)
school = "Mage linux"
name="Jack"
print("after name", name)
name="alex"
change_name(name,school)

print(name)
5.2全域性變數
school="oldboy Edu."
def change_name(name):
global school
school = "Mage linux"
print("before name",name,school)
name="Jack"
print("after name", name,school)
name="alex"
change_name(name)
print(school)
print(name)
6.遞迴
6.1定義:在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。
6.2遞迴的特性:

     1. 必須有一個明確的結束條件

     2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

     3. 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)

def cal(n):
print(n)
if int(n/2)>0:
return cal(int(n/2))
print("--->",n)
cal(10)
7.函數語言程式設計
定義:函數語言程式設計中的函式這個術語不是指計算機中的函式(實際上是Subroutine),而是指數學中的函式,即自變數的對映。也就是說一個函式的值僅決定於函式引數的值,不依賴其他狀態。比如sqrt(x)函式計算x的平方根,只要x不變,不論什麼時候呼叫,呼叫幾次,值都是不變的。
8.高階函式
變數可以指向函式,函式的引數能接收變數,那麼一個函式就可以接收另一個函式作為引數,這種函式就稱之為高階函式。

def add(a,b,f):
return f(a)+f(b)
res=add(3,-9,abs)
print(res)
9.作業
程式1: 實現簡單的shell sed替換功能
程式2:修改haproxy配置檔案 
需求:
1、查
    輸入:www.oldboy.org
    獲取當前backend下的所有記錄

2、新建
    輸入:
        arg = {
            'bakend': 'www.oldboy.org',
            'record':{
                'server': '100.1.7.9',
                'weight': 20,
                'maxconn': 30
            }
        }

3、刪除
    輸入:
        arg = {
            'bakend': 'www.oldboy.org',
            'record':{
                'server': '100.1.7.9',
                'weight': 20,
                'maxconn': 30
            }
        }
原配置檔案:
global       
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull

listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.oldboy.org
        server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000