1. 程式人生 > >python3自動化學習03

python3自動化學習03

變量 中斷函數 需要 拷貝 result pen vars show engine

概要:深淺拷貝、函數、lambda、內置函數、文件操作

一、深淺拷貝

1.對於字符串、數字來說,賦值、深拷貝、淺拷貝的結果是一樣的,都是用的內存中的同一個地址。

如下圖所示:

技術分享圖片

技術分享圖片
 1 import copy
 2 ‘‘‘
 3 
 4 a1 = 123
 5 a2 = 123
 6 #a2 = a1
 7 print(id(a1))
 8 print(id(a2))
 9 #淺拷貝,內存中的地址一樣
10 a3 = copy.copy(a1)
11 print(id(a1))
12 print(id(a3))
13 #深拷貝,內存中地址一樣
14 a4 = copy.deepcopy(a1)
15 print(id(a1)) 16 print(id(a4)) 17 #結論:對於字符串、數字來說,賦值,深淺拷貝用的都是內存中的同一個地址。
View Code

2.其他類型,如列表、字典、元組

對於字典、元組、列表 而言,進行賦值、淺拷貝和深拷貝時,其內存地址的變化是不同的

賦值:只是新創建了一個變量,該變量還是指向原來的內存地址

n1 = {‘k1‘:‘v1‘,‘k2‘:123,‘k3‘:["alex",678]}

n2 = n1

技術分享圖片

淺拷貝:在內存地址裏只拷貝一層,字典裏的元素沒拷貝

技術分享圖片

深拷貝:有多少層拷貝多少份,在內存中將所有的數據重新創建一份

技術分享圖片

技術分享圖片
 1 #!/usr/bin/env python3
2 #author:Alnk 3 import copy 4 5 #其他,如元組,列表,字典... 6 n1 = {k1:v1,k2:123,k3:["alex",678]} 7 8 #賦值 --內存地址還是一樣的 9 n2 = n1 10 print(id(n1)) 11 print(id(n2)) 12 13 #淺拷貝:在內存中只額外創建第一層數據 14 #第一層的內存地址已經不一樣了 15 n3 = copy.copy(n1) 16 print(id(n1)) 17 print(id(n3)) 18 #其他層的內存地址是一樣的 19 20 21 #
深拷貝:在內存中將所有的數據重新創建一份。更改拷貝後的數據,原來的數據不會收到影響 22 n4 = copy.deepcopy(n1) 23 print(id(n1)) 24 print(id(n4)) 25 # 26 print(id(n1[k1])) 27 print(id(n4[k1])) 28 print(id(n1[k2])) 29 print(id(n4[k2])) 30 print(id(n1[k3])) 31 print(id(n4[k3])) 32 print(id(n1[k3][0])) 33 print(id(n4[k3][0]))
View Code 技術分享圖片
 1 import copy
 2 
 3 #示例
 4 #監控模版
 5 #已經被監控的10臺機器當CPU超過80時報警,現在要新添加10臺機器的監控,CPU超過60就報警
 6 dic = {
 7     "cpu":[80,],
 8     "mem":[80,],
 9     "dis":[80,]
10 }
11 
12 ###如果用賦值的話則會把原來老的監控指標也更改了###
13 new_dic = dic
14 new_dic[cpu][0] = 60
15 print("old:",dic)
16 print("new:",new_dic)
17 ###################################################
18 
19 ####如果用淺拷貝的話則會把原來老的監控指標也更改了####
20 new_dic = copy.copy(dic)
21 new_dic[cpu][0] = 60
22 print("old:",dic)
23 print("new:",new_dic)
24 ###################################################
25 
26 #####深拷貝不會更改原來老的監控指標#####
27 new_dic = copy.deepcopy(dic)
28 new_dic[cpu][0] = 60
29 print("old:",dic)
30 print("new:",new_dic)
31 ###################################################
深淺拷貝練習

二、函數

1.基本概念

技術分享圖片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 
 4 def mail():
 5     n = 123
 6     n+=1
 7     print(n)
 8 
 9 #調用函數
10 mail()
11 
12 #賦值 ,f 指向了mail函數的內存地址
13 f = mail
14 #調用
15 f()
View Code

2.函數返回值

  函數如果沒有return,那麽默認返回None

  return作用:

    返回一個值

    中斷函數

技術分享圖片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 ‘‘‘
 4 #函數返回值練習(函數默認返回值為None)
 5 def mail():
 6     n = 123
 7     n+=1
 8     return 123
 9 
10 #執行函數,並且賦值給ret,拿到返回值
11 ret = mail()
12 print(ret)
13 ‘‘‘
14 
15 #return 返回一個值並且中斷函數操作
16 def show():
17     print(a)
18     return [11,22]
19     print(b)
20 ret = show()
21 print(ret)
View Code

擴展:pycharm斷點調試的方法

技術分享圖片

3.函數參數

函數參數可分為:

  普通參數(又叫位置參數)

  默認參數 #註意默認參數必須指向不可變對象!

  動態參數:

    可變參數 #調用的時候需要先組裝出一個list或tuple

    關鍵字參數 #關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict

    命名關鍵字參數

在Python中定義函數,可以用位置參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請註意,參數定義的順序必須是:位置參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。

技術分享圖片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 ‘‘‘
 4 #1.沒有參數
 5 def show():
 6     pass
 7 
 8 
 9 #2.位置參數 :一個參數
10 def show(arg):
11     print(arg)
12 show(‘kkkk‘)
13 #兩個參數,或者多個參數
14 def show(arg1,arg2):
15     print(arg1,arg2)
16 show(‘kkkk‘,‘bbbb‘)
17 
18 
19 #3.默認參數   -- 定義默認參數要牢記一點:默認參數必須指向不變對象!
20 def show(a1,a2=333):
21     print(a1)
22     print(a2)
23 show(‘aaa‘)
24 show(‘aaa‘,‘bbb‘)
25 #指定參數
26 def show(a1,a2):
27     print(a1)
28     print(a2)
29 show(a2=123,a1=999)
30 
31 
32 #4.動態參數(可變參數)--生成一個元組
33 def show(arg):
34     print(arg)
35 def show2(*arg):
36     print(arg,type(arg))
37 show(1)
38 show2(1)
39 show2(1,2,3,4,5)
40 
41 #動態參數(關鍵字參數) --生成一個字典
42 def show3(**kw):
43     print(kw,type(kw))
44 show3(a1=8)
45 show3(a1=8,a2=88)
46 #可變參數+關鍵字參數 --*args在前,**kw在後
47 def show(*args,**kw):
48     print(args,type(args))
49     print(kw,type(kw))
50 l = [11,22,33]
51 d = {"n1":66,"a1":99}
52 #show(11,222,333,44,a="bb",n3="cc")  #傳參數時註意位置
53 show(l,d)  #都放進*args裏面去了
54 show(*l,**d) #把列表或元組整個賦值給動態參數,需要加 * 或者 **
55 
56 #動態參數(命名關鍵字參數)
57 #對於關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。至於到底傳入了哪些,就需要在函數內部通過kw檢查。
58 #如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city和job作為關鍵字參數。這種方式定義的函數如下
59 #和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符*,*後面的參數被視為命名關鍵字參數
60 def person(name, age, *, city, job):
61     print(name, age, city, job)
62 person(‘Jack‘, 24, city=‘Beijing‘, job=‘Engineer‘)
63 person(‘Jack‘, 24, job=‘Beijing‘, city=‘Engineer‘)
64 #如果函數定義中已經有了一個可變參數,後面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了
65 def person(name, age, *args, city, job):
66     print(name, age, args, city, job)
67 #person(‘Jack‘, 24, ‘Beijing‘, ‘Engineer‘)   #調用失敗
68 
69 
70 #格式化
71 s1 = "{0} is {1}"
72 l = ["alnk","shuaiguo"]
73 #result = s1.format("alnk","shuaiguo")
74 result = s1.format(*l)
75 #print(s1.format("alnk","shuaiguo"))
76 print(result)
77 
78 s1 = "{name} is {acter}"
79 result = s1.format(name="alnk",acter="666")
80 print(result)
81 d = {"name":"alnk","acter":666}
82 result = s1.format(**d)
83 print(result)
84 ‘‘‘
代碼演示

三、lambad

技術分享圖片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 
 4 def f1(a):
 5     b = a + 1
 6     return b
 7 ret = f1(4)
 8 print(ret)
 9 
10 #lambda表達式  --簡單的函數表式方式
11 f2 = lambda a:a+1   #創建了形式參數a,創建了函數內容 a+1 ,並且把結果return
12 ret = f2(99)
13 print(ret)
View Code

四、內置函數

目前熟悉下圖標註的函數即可

技術分享圖片

技術分享圖片
  1 #!/usr/bin/env python3
  2 #author:Alnk
  3 ‘‘‘
  4 #abs() --絕對值
  5 print(abs(11))
  6 print(abs(-11))
  7 
  8 #all() --傳一個序列,會去循環該序列,一旦存在假的值就會返回False
  9 print(all([]))
 10 print(all(["",]))
 11 print(all([0,1,2]))
 12 #以下都為假,空的類型
 13 print(bool(None))
 14 print(bool(""))
 15 print(bool([]))
 16 print(bool(0))
 17 print(bool({}))
 18 
 19 #any() --只要有一個為真,就返回True
 20 print(any([0,1,2]))
 21 
 22 #bin() --返回二進制
 23 print(bin(100))
 24 
 25 #bool() --布爾值
 26 print(bool(None))
 27 print(bool(""))
 28 print(bool([]))
 29 print(bool(0))
 30 print(bool({}))
 31 print(bool(1))
 32 
 33 #chr() --把字符轉為ascii碼
 34 print(ord(‘a‘))
 35 
 36 #ord() --把ascii碼轉為字符,
 37 print(chr(97))
 38 
 39 #dict() --創建一個字典
 40 a =dict(v1=‘k1‘,v2=‘k2‘)
 41 print(a)
 42 
 43 #dir() --當前變量所有的方法
 44 a = ()
 45 print(dir(a))
 46 
 47 #divmod() --返回一個元組,第一個元素位商,第二個元素位余數
 48 print(divmod(4,2))
 49 
 50 #enumerate() --輸出編號
 51 li = ["a","b","c"]
 52 for i,item in enumerate(li,1):
 53     print(i,item)
 54 
 55 #eval() --字符串裏的數字乘積
 56 print(eval("6*8"))
 57 
 58 #filter() --用於過濾序列
 59 li = [11,22,33,44]
 60 def fun(x):
 61     if x > 33:
 62         return True
 63     else:
 64         return False
 65 l = filter(fun,li) #過濾
 66 print(list(l))
 67 
 68 #map() --加工
 69 li = [11,22,33,44]
 70 new_li = map(lambda x:x+100,li)
 71 l = list(new_li)
 72 print(l)
 73 
 74 #float() --創建小數
 75 a = 1
 76 b = float(a)
 77 print(b)
 78 
 79 #help() --幫助函數
 80 
 81 #id() --查看對象在內存中的地址
 82 
 83 #input() --輸入函數
 84 
 85 #int() --創建一個整數
 86 
 87 #len() --判斷一個對象的長度
 88 l1 = [1,23,44]
 89 print(len(l1))
 90 s1 = "str1"
 91 print(len(s1))
 92 
 93 #list() --創建一個列表
 94 a = list((1,2,3,4))
 95 print(a)
 96 
 97 #max() --返回最大值
 98 print(max(1,2,3,4))
 99 
100 #min() --返回最小值
101 print(min(1,2,3,4))
102 
103 #oct() --八進制
104 print(oct(10))
105 
106 #pow() --返回(x的y次方) 的值。
107 print(pow(2,5))
108 
109 #range() --返回一個序列
110 print(range(1,10))
111 
112 #reversed() --反轉叠代
113 l1 = [‘a‘,‘b‘,‘c‘]
114 l2 = reversed(l1)
115 for i in l2:
116     print(i)
117 
118 #round()  --四舍五入
119 print(round(8.9))
120 print(round(8.4))
121 
122 #set() --集合
123 a = set([1,2,3])
124 print(a)
125 
126 #sort() --排序
127 a = [‘b‘,‘c‘,‘a‘]
128 a.sort()
129 print(a)
130 
131 #str() --創建一個字符串
132 a = str("abcde")
133 print(a)
134 
135 #sum() --求和
136 print(sum([1,2,3],3))
137 print(sum([1,2]))
138 
139 #tuple() --元組
140 t = tuple([1,2,3,])
141 print(t)
142 
143 #type() --返回對象的類型
144 a = 1
145 print(type(a))
146 
147 #vars() --返回對象的屬性和屬性值的字典對象
148 class fo():
149     a = 1
150 print(vars(fo))
151 
152 #zip()  --映射
153 x = [1,2,3]
154 y = [4,5,6]
155 z = [7,8,9]
156 zipped = zip(x,y,z)
157 print(list(zipped))
158 ‘‘‘
View Code

五、文件操作(open()函數)

技術分享圖片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 ‘‘‘
 4 #read 按照字符來讀的
 5 f = open(‘log.txt‘,‘r‘,encoding=‘utf-8‘)
 6 ret = f.read(2)  #按照字符讀,不是按照字節
 7 f.close()
 8 print(ret)
 9 
10 #tell() --查看當前指針的位置,按照字節來的
11 f = open(‘log.txt‘,‘r‘,encoding=‘utf-8‘)
12 f.read(2)
13 print(f.tell())  #按照字節,不是字符
14 f.close()
15 
16 #seek --用來指定指針的位置,按照字節來的
17 f = open(‘log.txt‘,‘r‘,encoding=‘utf-8‘)
18 f.seek(3)
19 print(f.read())  #不加參數,全部讀取,加參數,指定讀取字符。是字符字符字符。。。
20 f.close()
21 
22 #truncate()  --截取指針前面的字節,並且刪除指針後面的數據
23 f = open(‘log.txt‘,‘r+‘,encoding=‘utf-8‘)
24 f.seek(3)
25 #print(f.read())
26 print(f.truncate())
27 f.close()
28 ‘‘‘
View Code

python3自動化學習03