1. 程式人生 > >python基礎05

python基礎05

直接 字節數組 locals mod sat 對象 max() list pac

Python基礎學習05


函數


一、什麽是函數

定義:函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可

特性:
1.減少重復代碼
2.使程序變的可擴展
3.使程序變得易維護

語法定義:

技術分享圖片
1 def test():        #test為函數名
2     print("in the test..")
3 test()        # 用test函數
4 
5 def test_1(x,y): #帶參數的函數
6     print(x)
7     print(y)
8 
9 test_1(2,3)   #調用時必須傳入參數(實參)
View Code

二、參數

1、形參實參

形參:形式參數,不是實際存在,是虛擬變量。在定義函數和函數體的時候用形參,目的是在函數調用時接收實參(實參個數,類型應與實參一一對應),形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量

實參:實際參數,調用函數時傳給函數的參數,可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值

區別:形參是虛擬的,不占用內存空間,形參變量只有在被調用時才分配內存單元,實參是一個變量,占用內存空間,數據傳送單向,實參傳給形參,不能形參傳給實參

技術分享圖片
1 def test_1(x,y): #x,y為形參
2     print(x)
3     print(y)
4 test_1(2,3)   #調2,3為實參
View Code

2、位置參數調用與關鍵字調用

技術分享圖片
 1 #位置參數和關鍵字(標準調用:實參和形參一一對應,關鍵字調用:位置無需固定)
 2 
 3 def test_1(x,y):
 4     print(x)
 5     print(y)
 6 test_1(2,3)   #這種調用為位置參數調用,形參和實參必須一一對應
 7 
 8 def test_1(x,y):
 9     print(x)
10     print
(y) 11 test_1(y=3,x=2) #這種調用為關鍵字調用,位置無需固定 12 13 def test_1(x,y,z): 14 print(x) 15 print(y) 16 print(z) 17 test_1(2,z=4,y=3) #既有位置參數調用,又有關鍵字調用時,位置調用參數必須寫在關鍵字調用參數之前
View Code

3、默認參數,可變參數

技術分享圖片
 1 #默認參數
 2 def test_1(x,y=3):  #y為默認參數
 3     print(x)
 4     print(y)
 5 test_1(2)         #調用時可以不賦值,如果不賦值則y=3 結果為:2,3
 6 test_1(2,4)       #調用時如果賦值,則y=4(調用時賦的值) 結果為:2,4
 7 #默認參數特點:調用函數的時候,默認參數非必須傳值
 8 
 9 #可變參數(參數組)
10 def test_2(*args):     #可以接收多個值
11     print(args)
12 test_2(1,2,3,4,5,6)    #直接傳遞參數,結果以元組的形式輸出:(1, 2, 3, 4, 5, 6)
13 test_2(*[1,2,3,4,5,6])  #或者在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去,結果同上
14 
15 def test_3(x,*args):
16     print(x,args)
17 test_3(1,2,3,4,5,6)   #輸出:1 (2, 3, 4, 5, 6)
18 
19 def test_2(**kwargs):     #可以接收多個關鍵字參數
20     print(kwargs)
21 test_2(name="zz",age="2")  #將關鍵字參數轉換成字典的形式:{‘age‘: ‘2‘, ‘name‘: ‘zz‘}
22 test_2(**{age: 2, name: zz})   #同上
View Code

三、其他特性

1、作用域:局部與全局變量

在子程序中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個程序,局部變量作用域是定義該變量的子程序。
當全局變量與局部變量同名時:在定義局部變量的子程序內,局部變量起作用;在其它地方全局變量起作用。

技術分享圖片
1 name = "aaa"
2 def change_name(name):
3     print("before change:",name)       #aaa
4     name = "zzz"
5     print("after change", name)        #zzz
6 change_name(name)
7 print("在外面的name",name)             #aaa
View Code

2、返回值

返回值的目的是要想獲取函數的執行結果,函數在執行過程中只要遇到return語句,就會停止執行並返回結果,return 語句代表著函數的結束;如果未在函數中指定return,那這個函數的返回值為None

3、匿名函數

匿名函數就是不需要顯式的指定函數,只能處理比較簡單的運算例如:三元運算,不能處理判斷循環等復雜運算。匿名函數主要是和其它函數搭配使用

技術分享圖片
1 #常規函數定義
2 def calc(n):
3     return n**n
4 print(calc(10))
5 
6 #換成匿名函數
7 calc = lambda n:n**n
8 print(calc(10))
View Code

4、遞歸

在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。

遞歸特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3. 遞歸效率不高,遞歸層次過多會導致棧溢出(遞歸上限999次)

技術分享圖片
 1 def num(n):
 2     print(n)
 3     if int(n/4) ==0:
 4         return n
 5     return num(int(n/4))
 6 num(20)
 7 ‘‘‘輸出:
 8 20
 9 5
10 1
11 ‘‘‘
View Code

四、內置函數

技術分享圖片

技術分享圖片
  1 #abs() 返回數字的絕對值
  2 print(abs(-32))  #輸出:32
  3 
  4 #all() 如果可叠代對象中所有元素都為真則返回真
  5 print(all([1,-1,2]))    #輸出:True(非0即真)
  6 print(all([0,-1,2]))    #輸出:False
  7 
  8 #any()  如果可叠代對象中任意元素為真則返回真
  9 print(any([0,-1,2]))    #輸出:True
 10 print(any([]))           #輸出:False
 11 
 12 #ascii() 把一個內存對象變成一個可打印的字符串
 13 print([ascii([1,-1,2])])   #輸出:[‘[1, -1, 2]‘]
 14 
 15 #bin() 十進制數字轉二進制
 16 print(bin(12))   #輸出:0b1100
 17 
 18 #bool  判斷真假
 19 print(bool("asd"))    #輸出:True(非0即真)
 20 print(bool([]))       #輸出:False
 21 
 22 #bytearray  可修改的二進制字節格式(沒啥用)
 23 b = bytearray("abcd",encoding="utf-8")
 24 print(b[1])   #輸出:98   (ascii碼的值)
 25 b[1] = 99     #必須是ascii碼的值
 26 print(b)      #輸出:bytearray(b‘accd‘)
 27 
 28 #bytes() 返回值為一個新的不可修改字節數組
 29 b = bytes("abcd",encoding="utf-8")
 30 print(b)        #輸出:b‘abcd‘
 31 
 32 #callable()  判斷是否可以調用
 33 print(callable([1,2]))   #輸出:False 列表不可調用,函數可調用
 34 
 35 #chr()  返回數字對應的ascii碼表中對應字母
 36 print(chr(100))      #輸出:d
 37 
 38 #ord()   返回字母對應的ascii碼表中的數字
 39 print(ord("d"))     #輸出:100
 40 
 41 #classmethod()  #類方法,修飾符對應的函數不需要實例化,不需要 self 參數,但第一個參數需要是表示自身類的 cls 參數,可以來調用類的屬性,類的方法,實例化對象等
 42 class A(object):
 43     bar = 1
 44     def func1(self):
 45         print (foo)
 46     @classmethod
 47     def func2(cls):
 48         print (func2)
 49         print (cls.bar)
 50         cls().func1()   # 調用 foo 方法
 51 A.func2()               # 不需要實例化
 52 """輸出:
 53 func2
 54 1
 55 foo
 56 """
 57 
 58 #compile() #底層的,用於把代碼進行編譯(用不到)
 59 
 60 #complex() 函數用於創建一個值為 real + imag * j 的復數或者轉化一個字符串或數為復數。如果第一個參數為字符串,則不需要指定第二個參數
 61 print(complex(1, 2))    #輸出:(1+2j)
 62 # 註意:這個地方在"+"號兩邊不能有空格,也就是不能寫成"1 + 2j",應該是"1+2j",否則會報錯
 63 print(complex("1+2j"))  #輸出:(1+2j)
 64 
 65 #delattr() 函數用於刪除屬性(面向對象:delattr()、getattr()、hasattr()、setattr())
 66 class Coordinate:
 67     x = 10
 68     y = -5
 69     z = 0
 70 point1 = Coordinate()
 71 print(x = ,point1.x)
 72 print(y = ,point1.y)
 73 print(z = ,point1.z)
 74 delattr(Coordinate, z)
 75 print(--刪除 z 屬性後--)
 76 print(x = ,point1.x)
 77 print(y = ,point1.y)
 78 # 觸發錯誤
 79 # print(‘z = ‘,point1.z)  #AttributeError: ‘Coordinate‘ object has no attribute ‘z‘
 80 
 81 #dir() 函數不帶參數時,返回當前範圍內的變量、方法和定義的類型列表;帶參數時,返回參數的屬性、方法列表。
 82 print(dir()) #輸出:[‘A‘, ‘Coordinate‘, ‘__builtins__‘, ‘__cached__‘, ‘__doc__‘, ‘__file__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__spec__‘, ‘b‘, ‘point1‘]
 83 
 84 # divmod() 函數把除數和余數運算結果結合起來,返回一個包含商和余數的元組(a // b, a % b)。
 85 print(divmod(7, 2))  #輸出:(3, 1)
 86 
 87 #enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。
 88 seasons = [Spring, Summer, Fall, Winter]
 89 print(list(enumerate(seasons)))  #輸出:[(0, ‘Spring‘), (1, ‘Summer‘), (2, ‘Fall‘), (3, ‘Winter‘)]
 90 print(list(enumerate(seasons, start=1)) )      # 下標從 1 開始[(1, ‘Spring‘), (2, ‘Summer‘), (3, ‘Fall‘), (4, ‘Winter‘)]
 91 for i, element in enumerate(seasons):
 92     print (i, seasons[i])
 93 ‘‘‘0 Spring
 94 1 Summer
 95 2 Fall
 96 3 Winter
 97 ‘‘‘
 98 
 99 #eval() 執行一個字符串表達式,並返回表達式的值。
100 print(eval( 3 * 2 ))  #輸出:6
101 
102 #exec()  執行一個文件
103 # exec(hello.py)
104 
105 #filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。
106 #過濾出1~100中平方根是整數的數:
107 import math
108 def is_sqr(x):
109     return math.sqrt(x) % 1 == 0
110 newlist = filter(is_sqr, range(1, 101))
111 for i in newlist:
112     print(i)   #在py2中為列表,3中為叠代器需要循環打印
113 
114 filter(lambda n:n>5,range(10))  #也可以用匿名函數
115 
116 #float() 將整數和字符串轉換成浮點數
117 print(float("123"))  #輸出:123.0
118 print(float(123))
119 
120 #format()  格式化輸出
121 
122 #frozenset() 返回一個凍結的集合,凍結後集合不能再添加或刪除任何元素。
123 print(frozenset(range(10))) #frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
124 
125 #getattr() 函數用於返回一個對象屬性值。(面向對象)
126 
127 #globals() 以字典類型返回當前位置的全部全局變量。
128 print(globals())
129 
130 #hasattr() 用於判斷對象是否包含對應的屬性。(面向對象)
131 
132 #hash() 用於獲取取一個對象(字符串或者數值等)的哈希值。
133 print(hash("asdf"))  #輸出:5704709918237842944
134 
135 #help() 用於查看函數或模塊用途的詳細說明。
136 help(sys)
137 help(str)
138 a = [1,2,3]
139 help(a)
140 help(a.append)
141 
142 #hex() 函數用於將10進制整數轉換成16進制,以字符串形式表示
143 print(hex(100))  #輸出:0x64
144 
145 #id() 函數用於獲取對象的內存地址。
146 a = "a"
147 print(id(a))  #輸出:3231243404264
148 
149 #input() 函數接受一個標準輸入數據,返回為 string 類型
150 #int() 函數用於將一個字符串或數字轉換為整型。
151 #isinstance() 函數來判斷一個對象是否是一個已知的類型,類似 type()。
152 a = 2
153 print(isinstance (a,int))      #  True
154 print(isinstance (a,str))      #  False
155 print(isinstance (a,(str,int,list)))    # 是元組中的一個返回 True
156 
157 ‘‘‘isinstance() 與 type() 區別:
158 type() 不會認為子類是一種父類類型,不考慮繼承關系。
159 isinstance() 會認為子類是一種父類類型,考慮繼承關系。
160 如果要判斷兩個類型是否相同推薦使用 isinstance()。
161 ‘‘‘
162 class A:
163     pass
164 class B(A):
165     pass
166 print(isinstance(A(), A))    #  True
167 print(type(A()) == A  )      #  True
168 print(isinstance(B(), A) )   #  True
169 print(type(B()) == A )       #  False
170 
171 #issubclass() 方法用於判斷參數 class 是否是類型參數 classinfo 的子類。(面向對象)
172 #iter() 用來生成叠代器
173 lst = [1, 2, 3]
174 for i in iter(lst):
175     print(i)
176 
177 #len() 方法返回對象(字符、列表、元組等)長度或項目個數
178 str = "runoob"
179 print(len(str) )            # 字符串長度:6
180 l = [1,2,3,4,5]
181 print(len(l)  )             # 列表元素個數:5
182 
183 #locals() 函數會以字典類型返回當前位置的全部局部變量。(參考globals)
184 print(locals())
185 
186 #map() 會根據提供的函數對指定序列做映射。
187 #第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。
188 def square(x) :            # 計算平方數
189     return x ** 2
190 map(square, [1,2,3,4,5])   # 計算列表各個元素的平方:[1, 4, 9, 16, 25]
191 map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函數:[1, 4, 9, 16, 25]
192 # 提供了兩個列表,對相同位置的列表數據進行相加
193 map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])  #[3, 7, 11, 15, 19]
194 #py3中結果為叠代器需循環打印
195 
196 #max() 方法返回給定參數的最大值,參數可以為序列。
197 print(max(1,3,4,2,0))   #輸出:4
198 #min() 方法返回給定參數的最小值,參數可以為序列。
199 print(min(1,3,4,2,0))   #輸出:0
200 
201 #memoryview() 函數返回給定參數的內存查看對象(Momory view)。所謂內存查看對象,是指對支持緩沖區協議的數據進行包裝,在不需要復制對象基礎上允許Python代碼訪問。
202 #next() 返回叠代器的下一個項目。
203 #object() 定義對象
204 #oct() 函數將一個整數轉換成8進制字符串。
205 print(oct(100))   #輸出:0o144
206 
207 #open() 文件操作
208 #pow() 方法返回 xy(x的y次方) 的值
209 print(pow(3,4))   #輸出:81
210 
211 #print() 方法用於打印輸出,最常見的一個函數。
212 #property() 函數的作用是在新式類中返回屬性值。(面向對象)
213 #range() 函數可創建一個整數列表,一般用在 for 循環中
214 #repr() 函數將對象轉化為供解釋器讀取的形式
215 #reverse() 函數用於反向列表中元素(列表操作中的一樣)
216 aList = [123, xyz, zara, abc, xyz]
217 aList.reverse()
218 print("List : ", aList) #輸出:List :  [‘xyz‘, ‘abc‘, ‘zara‘, ‘xyz‘, 123]
219 
220 #round() 方法返回浮點數x的四舍五入值。
221 print(round(1.234,2))  #輸出:1.23
222 
223 #set() 函數創建一個無序不重復元素集(參考創建集合)
224 #setattr 函數對應函數 getatt(),用於設置屬性值,該屬性必須存在。(面向對象)
225 #slice() 函數實現切片對象,主要用在切片操作函數裏的參數傳遞。
226 #sorted() 函數對所有可叠代的對象進行排序操作。
227 ‘‘‘
228 sort 與 sorted 區別:
229 sort 是應用在 list 上的方法,sorted 可以對所有可叠代的對象進行排序操作。
230 list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
231 ‘‘‘
232 a = [5,7,6,3,4,1,2]
233 b = sorted(a)       # 保留原列表
234 print(a)            #[5, 7, 6, 3, 4, 1, 2]
235 print(b)            #[1, 2, 3, 4, 5, 6, 7]
236 
237 L=[(b,2),(a,1),(c,3),(d,4)]
238 print(sorted(L, key=lambda x:x[1]) )              #  [(‘a‘, 1), (‘b‘, 2), (‘c‘, 3), (‘d‘, 4)]
239 
240 students = [(john, A, 15), (jane, B, 12), (dave, B, 10)]
241 sorted(students, key=lambda s: s[2])            # 按年齡排序[(‘dave‘, ‘B‘, 10), (‘jane‘, ‘B‘, 12), (‘john‘, ‘A‘, 15)]
242 sorted(students, key=lambda s: s[2], reverse=True)      # 按降序[(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘, ‘B‘, 10)]
243 
244 #staticmethod 返回函數的靜態方法(面向對象)
245 #str() 函數將對象轉化為適於人閱讀的形式
246 #sum() 列表求和計算
247 #super() 函數是用於調用父類(超類)的一個方法(面向對象)
248 #tuple() 將列表轉換為元組
249 #type()  所有數據類型的根源
250 #vars() 返回對象object的屬性和屬性值的字典對象
251 #zip() 函數用於將可叠代的對象作為參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
252 # 如果各個叠代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操作符,可以將元組解壓為列表。
253 a = [1,2,3]
254 b = [4,5,6]
255 c = [4,5,6,7,8]
256 zipped = zip(a,b)     # 打包為元組的列表[(1, 4), (2, 5), (3, 6)]
257 zip(a,c)              # 元素個數與最短的列表一致[(1, 4), (2, 5), (3, 6)]
258 zip(*zipped)          # 與 zip 相反,可理解為解壓,返回二維矩陣式[(1, 2, 3), (4, 5, 6)]
259 #py3中為叠代器,需循環打印
260 
261 #__import__() 函數用於動態加載類和函數 。
262 # 如果一個模塊經常變化就可以使用 __import__() 來動態載入。
View Code

python基礎05