1.函數簡介
def my_len():# 函數必須先定義後調用,定義後的函數能夠在任何位置調用
# def關鍵字 函數名()
本身寫的函數出現的兩點問題
# 沒有返回值 只能固定打印操做
# 只可以固定的統計某一個容器內型的長度python
2.函數返回值
def func():
return'fdsf'
res = func()
print(res)面試
# 函數內要想返回給調用者值 必須用關鍵字return
"""
不寫return #返回None
只寫return
寫return None
寫return返回一個值
寫return返回多個值
"""app
只寫return:返回None 還能夠結束整個函數函數
寫return None和只寫renturn是同樣的ui
# 寫return返回一個值:這個值能夠是python任意數據類型
# def func():
# return '123'
# def func1():
# return [1,2,3]
# print(func(),func1())字符串
寫return返回多個值:renturn會自動將多個值以元組的形式返回給調用者
"""
1.爲何組織成元祖返回
函數不但願本身處理的結果被修改
2.如何不返回元祖
"""it
def func():
return 1, 2, 3, 4 # 返回的是(1, 2, 3, 4)io
# res = func()
# print(res)for循環
def func1():
return 'a', 'b', 'c' # ('a', 'b', 'c')容器
res = func1()
print(res)
def func2():
return [1, 2, 3], [1, 2, 3], [1, 2, 3] # ([1, 2, 3], [1, 2, 3], [1, 2, 3])
res1 = func2()
print(res1)
def func3():
return {'name': 'jason'}, {'username': 'tank'}, {
'user_name': 'egon'} # ({'name': 'jason'}, {'username': 'tank'}, {'user_name': 'egon'})
# 返回多個值 而且不想讓return幫你作處理 本身手動加上你想返回的數據類型符號
def func4():
return [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 34]]
"""
1.全部的函數都有返回值,不管你寫不寫return
python中全部的函數都有返回值 不寫的狀況下默認返回None
2.光寫return 或者return None並非爲了考慮返回值 而是爲告終束函數的運行
"""
3.函數參數概要
"""
positional arguments:位置參數
param 參數
required 需求的
"""
s = 'hello'
l = [1.2,3,4]
# print(len(s))
# print(len(l))
def my_len(args): # 須要0個參數
print(args)
n = 0
for i in args:
n += 1
return n
# res = my_len()
# print(res)
# my_len(l) # 給my_len傳了一個參數
# my_len('asda')
print(my_len('hello'))
print(my_len('hello world'))
print(my_len([1,2,3,4,5]))
"""
函數參數的兩大類型
形參:在函數的定義階段 括號內寫的變量名 叫作該函數的形式參數 簡稱 形參
實參:在函數的調用階段 括號內實際傳入的值 叫作實際參數 簡稱 實參
形參與實參的關係
形參就至關於變量名,而實參就至關於變量的值
函數調用傳參的過程 就是給形參變量名賦值的過程
注意:形參和實參的綁定關係只在函數的調用階段有效,函數運行結束關係自動解除
只在函數內部有效 函數外部無任何影響
函數的簡易結構
def 函數名(形參1,形參2...):
'''函數的註釋 用來描述該函數的做用以及各個形參的類型'''
函數體代碼1
函數體代碼2
...
return 函數的返回值
"""
4.位置參數
# 位置參數:在函數定義階段按照位置從左往右依次書寫的變量名 叫作函數位置形參
# 位置形參在調用的時候 必須爲其傳值
def my_max(x,y):
print(x,y)
if x > y:
return x
else:
return y
# res = my_max(1) # 在調用函數的時候 少一個實參不行
# res = my_max(1,2,3) # 在調用函數的時候 多一個實參也不行
# res = my_max(20,10)
# 位置實參:在函數的調用階段 傳入的參數會按照位置一一對應給形參
# print(res)
# 第一種直接按照位置傳 一一對應
# 第二種指名道姓的傳 >>>:關鍵字傳參
# my_max(y=20,x=10)
# my_max(10,y=20) # 位置和關鍵字混合使用
# my_max(20,y=40)
my_max(20,y=40,x=30) # 報錯
"""
注意:在函數的調用階段 位置參數和關鍵字參數能夠混合使用
可是必須保證
1.位置參數必須在關鍵字參數的前面(越短的越靠前,越長的越複雜的越靠後)
2.同一個形參不能被屢次賦值
"""
5.默認值參數
# 默認值參數:在函數的定義階段,形參(變量名)就已經被賦值了
# 在調用的時候能夠不爲默認值形參傳值,默認使用定義階段就已經綁定的值
# 在調用的時候若是能夠給默認值形參傳值 傳了那麼就使用你傳的值
# 在定義階段 默認值形參必須放在位置形參的後面
# def my_max(x,y=100):
# if x > y:
# return x
# return y
# # res = my_max(200)
# res1 = my_max(200,1000)
# res2 = my_max(y=200,x=1000)
# print(res2)
# def register(username,age,gender='male'):
# print(username,age,gender)
# register('jason',18)
# register('tank',28)
# register('egon',84)
# register('kevin',58)
# register('xiaohou',17,'female')
# 默認值參數的應用場景
# 當形參接收的到值比較單一的狀況下 一般能夠考慮用默認值形參
方法一
# def info(username,hobby,l=None): # 面試題 l爲空列表時連續
#使用函數會不斷往空列表中傳遞實參相似於字典中的函數dict.fromkeys()的錯誤
# if l == None:
# l = []
# l.append(hobby)
# print('%s 的愛好是 %s'%(username,l))
# info('jason','study')
# info('tank','生蠔')
# info('kevin','喝腰子湯')
# info('egon','女教練')
# 解決方法2
# info('jason','study',[])
# info('tank','生蠔',[])
# info('kevin','喝腰子湯',[])
# info('egon','女教練',[])
# m = 100
# def my_max(x,y=m):
# print(x,y)
# m = 222
# my_max(111)
def func(x,y=100):
print(x,y)
"""
函數在定義階段 內部所使用的變量都已經初始化完畢了
不會由於調用的位置的變化 而影響到內部的值(暫時可忽略)
函數不管在什麼地方被調用
都會跑到函數定義階段去執行代碼
形參中ke'ba用到的值都是往函數定義階段代碼往上找
"""
6.可變長參數
# 可變長參數
# 站在調用函數傳遞實參的角度 實參的個數不固定的狀況
# 也就意味形參也不固定
# 站在形參的角度 能夠用*和**來接收多餘的(溢出的)位置參數和關鍵字參數
# 站在形參的角度 看 *
# 形參中的*會將多餘的(溢出的)位置實參 統一用元組的形式處理 傳遞給*後面的形參名
# def func(x,y,*z):
# print(x,y,z) # z = (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8)
# func(1,2,3,4,5,6,7,8,54,43,4,5,6,6,7,8,)
# 站在實參的角度 看 *
# def func(x,y,z):
# print(x,y,z)
# # l = [1,2,3]
# # a,b,c = l
# # func(a,b,c)
# # func(*[1,2,3,4,5,6]) # *會將列表打散成位置實參一一傳入等價於func(1,2,3,4,5,6)
# func(*(1,2,3)) # 等價於func(1,2,3)
# def func(x,*z):
# print(x,z)
# func(1,*{1,2,3}) # *在形參中只能接收多餘的位置實參 不能接收關鍵字實參
# *只能將列表 元組 集合 字符串
# *的內部你能夠當作是for循環
# 站在形參的角度看 **
# def func(x,y,**z):
# print(x,y,z) # z = {'z': 1, 'a': 1, 'b': 2, 'c': 3}
# func(x=1,y=2,z=1,a=1,b=2,c=3)
# **會接收全部多餘的關鍵字參數 並將關鍵字參數 轉換成字典的形式 字典的key就是關鍵字的名字
# 字典的value就是關鍵字的名字指向的值 將字典交給**後面的變量名
# 站在實參的角度看 **
def func(x, y, z):
print(x, y, z)
# func(12,3,4)
# func(x=1,y=2,z=3)
# d = {'x':1,'y':2,'z':333}
# func(x=1,y=2,z=3)
# func(**d) # 等價於func(x=1,y=2,z=333)
# **會將字典拆封成 key = value的形式
"""
總結 * 與 **
*在形參中可以接受多餘的位置參數 組織成一個元祖賦值給*後面的變量名
**在形參中可以接受多餘的關鍵字參數 組織成一個字典賦值給**後面的變量名
*:在實參中 *可以將列表 元祖 集合 字符串 打散成位置實參的形式傳遞給函數
(*就當作是for循環取值)
**:在實參中 能將字典打散成key = value的形式 按照關鍵字參數傳遞給函數
"""
# 需求 你寫的函數 不管調用者按照正確傳參的方式不管怎麼傳 你的函數都可以正常執行
# def func1(*x,**y):
# print(x,y)
# func1(1,2,3,4,5,6,x=1,y=2,z = 3)
"""
注意python推薦形參*和**通用的寫法
"""
def func2(*args, **kwargs):
print(args, kwargs)
func2(1, 2, 3, 4, 5, 6, x=1, y=2, z=3)