摘要:基礎基礎函數定義一個函數要使用語句,依次寫出函數名括號括號中的參數和冒號,然后,在縮進塊中編寫函數體,函數的返回值用語句返回。用循環調用時,發現拿不到的語句的返回值。
Python 基礎 基礎 函數
定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然后,在縮進塊中編寫函數體,函數的返回值用return語句返回。
def my_abs(x): if x >= 0: return x else: return -x // my_abs(-9) 調用空函數
如果想定義一個什么事也不做的空函數,可以用pass語句:
def nop(): pass // pass 作為占位符
在其他語句里
if age >= 18: pass參數檢查
調用函數時,如果參數個數不對,Python解釋器會自動檢查出來,并拋出TypeError
def my_abs(x): if not isinstance(x, (int, float)): raise TypeError("bad operand type") // 數據類型檢查可以用內置函數isinstance()實現: if x >= 0: return x else: return -x返回多個值
import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny默認參數
定義默認參數要牢記一點:默認參數必須指向不變對象!
def enroll(name, gender, age=6, city="shanghai"): print("gender:",gender) print("age:",age) print("city:",city) enroll("shan","F") enroll("shan","M",5,"beijing") enroll("shan","F",age=6) def add_end(L=None): if L is None: L = [] L.append("END") return L add_end()可變參數
def calc(numbers): sum = 0 for n in numbers: sum = sum + n * n return sum calc([1, 2, 3]) // 調用的時候,需要先組裝出一個list或tuple calc(1, 2, 3) nums = [1, 2, 3] calc(*nums) // 定義可變參數和定義一個list或tuple參數相比,僅僅在參數前面加了一個*號
關鍵字參數
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
def person(name, age, **kw): print("name:", name, "age:", age, "other:", kw) person("Bob", 35, city="Beijing") person("Adam", 45, gender="M", job="Engineer") extra = {"city": "Beijing", "job": "Engineer"} person("Jack", 24, **extra) // **extra表示把extra這個dict的所有key-value用關鍵字參數傳入到函數的**kw參數命名關鍵字參數
如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city和job作為關鍵字參數
和關鍵字參數*kw不同,命名關鍵字參數需要一個特殊分隔符,*后面的參數被視為命名關鍵字參數。
def person(name, age, *, city, job): print(name, age, city, job) person("Jack", 24, city="Beijing", job="Engineer") # person("Jack", 24, "Beijing", "Engineer") 命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用將報錯
如果沒有可變參數,就必須加一個作為特殊分隔符。如果缺少,Python解釋器將無法識別位置參數和命名關鍵字參數:
def person(name, age, city, job): # 缺少 *,city和job被視為位置參數 pass參數組合
在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
def f1(a, b, c=0, *args, **kw): print("a =", a, "b =", b, "c =", c, "args =", args, "kw =", kw) def f2(a, b, c=0, *, d, **kw): print("a =", a, "b =", b, "c =", c, "d =", d, "kw =", kw)
在函數調用的時候,Python解釋器自動按照參數位置和參數名把對應的參數傳進去。
>>> f1(1, 2) a = 1 b = 2 c = 0 args = () kw = {} >>> f1(1, 2, c=3) a = 1 b = 2 c = 3 args = () kw = {} >>> f1(1, 2, 3, "a", "b") a = 1 b = 2 c = 3 args = ("a", "b") kw = {} >>> f1(1, 2, 3, "a", "b", x=99) a = 1 b = 2 c = 3 args = ("a", "b") kw = {"x": 99} >>> f2(1, 2, d=99, ext=None) a = 1 b = 2 c = 0 d = 99 kw = {"ext": None}
最神奇的是通過一個tuple和dict,你也可以調用上述函數:
>>> args = (1, 2, 3, 4) >>> kw = {"d": 99, "x": "#"} >>> f1(*args, **kw) a = 1 b = 2 c = 3 args = (4,) kw = {"d": 99, "x": "#"} >>> args = (1, 2, 3) >>> kw = {"d": 88, "x": "#"} >>> f2(*args, **kw) a = 1 b = 2 c = 3 d = 88 kw = {"x": "#"}遞歸函數
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
舉個例子,計算階乘n! = 1 x 2 x 3 x ... x n
def fact(n): if n==1: return 1 return n * fact(n - 1)
使用遞歸函數需要注意防止棧溢出。在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由于棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。
可以試試fact(1000):
尾遞歸是指,在函數返回的時候,調用自身本身,并且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只占用一個棧幀,不會出現棧溢出的情況。
def fact(n): return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)切片
取前N個元素
L = ["Michael", "Sarah", "Tracy", "Bob", "Jack"] for i in range(n): r.append(L[i]) L[0:3] // 完成切片 L[-2:] // 倒數第2個開始
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。
倒數第一個元素的索引是-1
L = list(range(100)) # >>> L [0, 1, 2, 3, ..., 99] >>> L[:10] 前10個數 >>> L[-10:] 后10個數: >>> L[10:20] 前11-20個數 >>> L[:10:2] 前10個數,每兩個取一個 >>> L[::5] 所有數,每5個取一個: >>> L[:] 所有的
字符串"xxx"也可以看成是一種list,每個元素就是一個字符。
>>> "ABCDEFG"[:3] "ABC" >>> "ABCDEFG"[::2] "ACEG" def trim(s): if (s[:1] == " "): return trim(s[1:]) if (s[-1:] == " "): return trim(s[:-1]) return s迭代
如果給定一個list或tuple,通過for循環來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)
d = {"a": 1, "b": 2, "c": 3} for key in d: print(key)
dict的存儲不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣
for ch in "abcde" print(ch)
如何判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
>>> from collections import Iterable >>> isinstance("abc", Iterable) # str是否可迭代 True >>> isinstance([1,2,3], Iterable) # list是否可迭代 True >>> isinstance(123, Iterable) # 整數是否可迭代 False
# Python內置的enumerate函數可以把一個list變成索引-元素對 for i, value in enumerate(["A", "B", "C"]): print(i, value) # 在for循環中,引用了兩個變量 for x, y in [(1, 1), (2, 4), (3, 9)]: print(x, y)列表生成式
List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式
>>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> L = [] >>> for x in range(1, 11): L.append(x * x) >>>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # for循環后面加條件判斷 >>>[x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100] # 兩層循環 [m + n for m in "ABC" for n in "XYZ"] ["AX", "AY", "AZ", "BX", "BY", "BZ", "CX", "CY", "CZ"] import os # 導入os模塊,模塊的概念后面講到 >>> [d for d in os.listdir(".")] # os.listdir可以列出文件和目錄
for循環其實可以同時使用兩個甚至多個變量
d = {"x": "A", "y": "B", "z": "C" } for k, v in d.items(): print(k, "=", v) [k + "=" + v for k, v in d.items()] L = ["Hello", "World", "IBM", "Apple"] [s.lower() for s in L] #大寫變小寫生成器
如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出后續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> gat 0x1022ef63 next(g) for n in g: print(n)
創建L和g的區別僅在于最外層的[]和(),L是一個list,而g是一個generator。
可以通過next()函數獲得generator的下一個返回值:
著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到,函數
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return "done"
把fib函數變成generator,只需要把print(b)改為yield b就可以了:
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return "done" >>> f = fib(6) >>> f
最難理解的就是generator和函數的執行流程不一樣。
函數是順序執行,遇到return語句或者最后一行函數語句就返回。
generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
用for循環調用generator時,發現拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中:
>>> g = fib(6) while True: try: x = next(g) print("g:", x) except StopIteration as e: print("Generator return value:", e.value) break迭代器
凡是可作用于for循環的對象都是Iterable類型;
凡是可作用于next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;
集合數據類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。
for x in [1, 2, 3, 4, 5]: pass 實際上完全等價于: # 首先獲得Iterator對象: it = iter([1, 2, 3, 4, 5]) # 循環: while True: try: # 獲得下一個值: x = next(it) except StopIteration: # 遇到StopIteration就退出循環 break
使用isinstance()判斷一個對象是否是Iterable對象:
>>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance("abc", Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41592.html
摘要:基礎知識基礎語法基礎知識編程第一步基礎知識基本數據類型基礎知識解釋器基礎知識注釋基礎知識運算符基礎知識數字基礎知識字符串基礎知識列表基礎知識元組基礎知識字典基礎知識條件控制基礎知識循環基礎知識迭代器與生成器基礎知識函數基礎知識數據結構基礎知 Python3基礎知識 | 基礎語法?Python3基礎知識 | 編程第一步?Python3基礎知識 | 基本數據類型Python3基礎知識 | ...
摘要:基礎知識基礎語法基礎知識編程第一步基礎知識基本數據類型基礎知識解釋器基礎知識注釋基礎知識運算符基礎知識數字基礎知識字符串基礎知識列表基礎知識元組基礎知識字典基礎知識條件控制基礎知識循環基礎知識迭代器與生成器基礎知識函數基礎知識數據結構基礎知 Python3基礎知識 | 基礎語法?Python3基礎知識 | 編程第一步?Python3基礎知識 | 基本數據類型Python3基礎知識 | ...
摘要:首先,在學習之前一定會考慮一個問題版本選擇對于編程零基礎的人來說,選擇。建議從下面課程開始教程標準庫官方文檔非常貼心地提供中文翻譯首先需要學習的基礎知識,下載安裝導入庫字符串處理函數使用等等。 提前說一下,這篇福利多多,別的不說,直接讓你玩回最有手感的懷舊游戲,參數貼圖很方便自己可以根據喜好修改哦。 本篇通過以下四塊展開,提供大量資源對應。 showImg(https://segmen...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
閱讀 3166·2021-11-23 09:51
閱讀 678·2021-10-14 09:43
閱讀 3200·2021-09-06 15:00
閱讀 2403·2019-08-30 15:54
閱讀 2557·2019-08-30 13:58
閱讀 1840·2019-08-29 13:18
閱讀 1372·2019-08-27 10:58
閱讀 506·2019-08-27 10:53