<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
函數先定義函數,後呼叫
Python 定義函數使用 def 關鍵字
預設情況下,引數值和引數名稱是按函數宣告中定義的順序匹配起來的。
def 函數名(param1,param2……): """ 函數功能的描述資訊 :param1:描述 :param2:描述 :return:返回值 """ code ... return 返回值
def register(): """註冊功能""" username = input('username: ').strip() pwd = input('password: ').strip() with open('32.txt', 'a', encoding='utf8') as fa: fa.write(f"{username}:{pwd}n") fa.flush()
def sum_self(x, y): """求和""" res = x+y print(res) sum_self(1,2) # 3
你只知道你需要實現某個功能,但不知道該如何用程式碼實現時,你可以暫時寫個空函數
def func(): pass
定義一個函數:給了函數一個名稱,指定了函數裡包含的引數,和程式碼塊結構。
這個函數的基本結構完成以後,你可以通過另一個函數呼叫執行,也可以直接從 Python 命令提示字元執行。
函數名(param1、param2……)
如:
register()
def foo(): pass print(foo()) #None
def func(): name = 'nick' age = 19 hobby_list = ['read', 'run'] return name, age, hobby_list name, age, hobby_list = func() print(name,age,hobby_list) #('nick', 19, ['read', 'run'])
在函數定義階段,按照從左到右的順序依次定義的形參,稱之為位置形參。
特點:按照位置定義的形參,都必須被傳值,多一個不行,少一個也不行。
def func(x, y): print(x) print(y)
在函數呼叫階段,按照從左到右的順序依次定義的實參,稱之為位置實參。
特點:按照位置為對應的形參依次傳值。
func(1, 2)
在呼叫函數時,按照key=value的形式為指定的引數傳值,稱為關鍵字實參。
特點:可以打破位置的限制,但仍能為指定的形參賦值。
func(y=2, x=1)
func(x, y=2) func(y=2, x) # SyntaxError: positional argument follows keyword argument func(x, x=1) # NameError: name 'x' is not defined
在定義階段,就已經被賦值。意味著在呼叫時可以不用為其賦值。位置形參必須放在預設形參的左邊。
def func(x, y=10): print(x) print(y) func(2)
預設形參的值只在定義階段賦值一次,也就是說預設引數的值在函數定義階段就已經固定了。
m = 10 def foo(x=m): print(x) m = 111 foo() # 10
預設引數的值通常應該是不可變型別。
def register(name, hobby, hobby_list=None): hobby_list = [hobby] print(f"{name} prefer {hobby_list}") register('nick', 'read') # ['read'] register('tank', 'zuipao') # [ 'zuipao'] register('jason', 'piao') # ['piao'] # 演示形參是可變型別,(列表是可變型別) def register(name, hobby, hobby_list=None): hobby_list = [hobby] print(f"{name} prefer {hobby_list}") register('nick', 'read') # nick prefer ['read'] register('tank', 'zuipao') # tank prefer ['zuipao'] register('jason', 'piao') # jason prefer ['piao']o']
形參中的*會將溢位的位置實參全部接收,然後儲存元組的形式,然後把元組賦值給*後的引數。需要注意的是:*後的引數名約定俗成為args。
def sum_self( *args): res = 0 for num in args: res += num return res res = sum_self(1, 2, 3, 4) print(res) # 10
實參中的*,*會將*後引數的值迴圈取出,打散成位置實參。以後但凡碰到實參中帶*的,它就是位置實參,應該馬上打散成位置實參去看。
def func(x, y, z, *args): print(x, y, z, args) func(1, *(1, 2) , 3, 4) # 1 1 2 (3, 4)
形參中的**會將溢位的關鍵字實參全部接收,然後儲存字典的形式,然後把字典賦值給**後的引數。需要注意的是:**後的引數名約定俗成為kwargs。
def func( **kwargw): print(kwargw) func(a=5,b=3) # {'a': 5, 'b': 3}
實參中的**,**會將**後引數的值迴圈取出,打散成關鍵字實參。以後但凡碰到實參中帶**的,它就是關鍵字實參,應該馬上打散成關鍵字實參去看。
def func(x, y, z, **kwargs): print(x, y, z, kwargs) func(1, 3, 4, **{'a': 1, 'b': 2} ) # 1 3 4 {'a': 1, 'b': 2}
def index(name, age, sex): print(f"name: {name}, age: {age}, sex: {sex}") # name: nick, age: 19, sex: male def wrapper(*args, **kwargs): print(f"args: {args}") # args: () print(f"kwargs: {kwargs}") # kwargs: {'name': 'nick', 'sex': 'male', 'age': 19} index( *args, **kwargs) wrapper(name='nick', sex='male', age=19)
命名關鍵字則是在「位置引數」和「命名關鍵字引數」中使用,*,隔開,後面的即為命名關鍵字。* 後的引數必須用關鍵字傳入。
def student(name, age, *, city, gender): print(name, age, city, gender) student('xiaoming', 6, city='beijing', gender='male') # xiaoming 6 beijing male student('xiaoming', 6, 'beijing', 'male') #TypeError: student() takes 2 positional arguments but 4 were given
特點:在傳值時,必須按照key=value的方式傳值,並且key必須命名關鍵字引數的指定的引數名。
def register(x, y, *, name, gender='male', age): print(x) print(name) print(age) register(1, 2, name1='nick', age=19) # TypeError: register() got an unexpected keyword argument 'name1'
Python3.8 新增了一個函數形參語法, “/” 用來指明函數形參必須使用指定位置引數,不能使用關鍵字引數的形式。
在以下的例子中,形參 a 和 b 必須使用指定位置引數,c 或 d 可以是位置形參或關鍵字形參,而 e 或 f 要求為關鍵字形參:
def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f)
以下使用方法是正確的:
f(10, 20, 30, d=40, e=50, f=60)
函數是第一類物件,即函數可以被當做資料處理。
def func(): print('from func') print(func) #
def func(): print('from func') def foo(m): m() foo(func) # from func
def func(): print('from func') def foo(x): return x res = foo(func) print(res) #
def func(): print('from func') function_list = [func] function_list[0]() # from func
遞迴的精髓在於通過不斷地重複逼近一個最終的結果。
age(1)=26,age(n)=age(n-1)+2 ,求age(5)的值:
''' ... age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 26 age(n) = age(n-1) +2 age(1) = 26 # n=1 ''' def age(n): if n == 1: return 26 res = age(n-1) + 2 return res print(f"age(5): {age(5)}")
遞迴的本質就是乾重復的活。
lis = [1, [2, [3, [4, [5, [6, ]]]]]] def tell(lis): for i in lis: if type(i) is list: tell(i) else: print(i) tell(lis)
二分法的思想實現查詢數位。
from random import randint nums = [randint(1, 100) for i in range(100)] nums = sorted(nums) def search(search_num, nums): print(nums) mid_index = len(nums) // 2 if not nums: print('not exists') return if search_num > nums[mid_index]: # in the right nums = nums[mid_index + 1:] search(search_num, nums) elif search_num < nums[mid_index]: # in the left nums = nums[:mid_index] search(search_num, nums) else: print('find it') search(7, nums)
python 使用 lambda 來建立匿名函數。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。
lamdbda 引數 : 邏輯程式碼
# 可寫函數說明 sum = lambda arg1, arg2: arg1 + arg2 # 呼叫sum函數 print ("相加後的值為 : ", sum( 10, 20 )) print ("相加後的值為 : ", sum( 20, 20 ))
匿名函數,他沒有繫結名字,使用一次即被收回,加括號既可以執行。
print(lambda x, y: x + y ) # (x, y)> res = (lambda x, y: x + y)(1, 2) print(res) # 3
lambda 匿名函數也是可以使用"關鍵字引數"進行引數傳遞,也可以設定預設值。
g = lambda x=0, y=0: x ** 2 + y ** 2 print(g(2, 3)) # 13 print(g(2)) # 4 print(g(y=3)) # 9
匿名函數通常與max()、sorted()、filter()、sorted()方法聯用。
如果我們想從上述字典中取出薪資最高的人,我們可以使用max()方法,但是max()預設比較的是字典的key。
salary_dict = { 'nick': 3000, 'jason': 100000, 'tank': 5000, 'sean': 2000 } print(max(salary_dict)) # tank def func(k): return salary_dict[k] print(max(salary_dict, key=func)) # jason print(max(salary_dict, key=lambda name: salary_dict[name] ) ) # jason 匿名函數
如果我們想對上述字典中的人,按照薪資從大到小排序,可以使用sorted()方法。
lis = [1, 3, 2, 5, 8, 6] sorted(lis) print(lis) # [1, 3, 2, 5, 8, 6] print(sorted(lis, reverse=True)) # [8, 6, 5, 3, 2, 1] salary_dict = { 'nick': 3000, 'jason': 100000, 'tank': 5000, 'sean': 2000 } print(sorted(salary_dict, key=lambda name: salary_dict[name] )) # ['sean', 'nick', 'tank', 'jason']
如果我們想對一個列表中的某個人名做處理,可以使用map()方法。
name_list = ['jason', 'tank', 'sean'] res = map(lambda name: f"{name} sb", name_list) print(list(res)) # ['jason sb', 'tank sb', 'sean sb']
如果我們想篩選除名字中含有'sb'的名字,我們可以使用filter()方法。
name_list = ['nick', 'jason sb', 'tank sb', 'sean sb'] filter_res = filter(lambda name: name.endswith('sb'), name_list) print(list(filter_res)) # ['jason sb', 'tank sb', 'sean sb']
共68個:
abs()、 all()、 any()、 ascii()、 bin()、 bool()、 bytearray()、 bytes()、 callable()、 chr()、 classmethod()、 compile()、 complex()、 delattr()、
dict()、 dir()、 divmod()、 enumerate()、 eval()、 exec()、 filter()、 float()、 format()、 frozenset()、 getattr()、 globals()、 hasattr()、 hash()、
help()、 hex()、 id()、 input()、 int()、 isinstance()、 issubclass()、 iter()、 len()、 list()、 locals()、 map()、 max()、 memoryview()、
min()、 next()、 object()、 oct()、 open()、 ord()、 pow()、 print()、 property()、 range()、 repr()、 reversed()、 round()、 set()、
setattr()、 slice()、 sorted()、 staticmethod()、 str()、 sum()、 super()、 tuple()、 type()、 vars()、 zip()、 __import__()、
res = '你好'.encode('utf8') print(res) # b'xe4xbdxa0xe5xa5xbd' res = bytes('你好', encoding='utf8') print(res) # b'xe4xbdxa0xe5xa5xbd'
print(chr(65)) #A print(ord('A')) #65
print(divmod(10, 3)) #(3, 1)
l = ['a', 'b', 'c'] for i in enumerate(l): print(i) # (0, 'a') # (1, 'b') # (2, 'c')
lis = '[1,2,3]' lis_eval = eval(lis) print(lis_eval) #[1, 2, 3]
print(hash(1)) #1
print(abs(-13)) # 13
print(all([1, 2, 3, 0])) #False print(all([])) #True
print(any([1, 2, 3, 0])) #True print(any([])) #False
print(bin(17)) #0b10001 print(oct(17)) #0o21 print(hex(17)) #0x11
import time print(dir(time)) # ['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname', 'tzset']
s = frozenset({1, 2, 3}) print(s) #({1, 2, 3})
# print(globals()) def func(): a = 1 # print(globals()) print(locals()) func() # {'a': 1}
print(pow(3, 2, 3)) # (3**2)%3 =0
print(round(3.5)) #4
lis = ['a', 'b', 'c'] s = slice(1, 4, 1) print(lis[s]) #['b', 'c'] # print(lis[1:4:1])
print(sum(range(100))) #4950
m = __import__('time') print(m.time()) #1556607502.334777
到此這篇關於Python函數的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45