def 函数名( [形参1,形参2,.....形参n ] ):
代码块
函数名必须要符合标识符规范
可以包含字母、数字、下划线,但不能以数字开头。
函数对象()
def fn(a=5, b=10):
print("a=", a)
print("b=", b)
fn(100, 200)
fn(b=222, a=111)
def fn(a=5, b=10, c=15):
print("a=", a)
print("b=", b)
print("c=", c)
fn(3, 6, c=9)
在形参前边加上*,这样这个形参将会获取到所有的实参。
它会将所有的实参保存到一个元组中。
def sum(*a):
result = 0
# 遍历元组
for n in a:
result += n
print(result)
sum(1, 2)
sum(5, 15, 25)
sum(6, 66, 666)
def fn(a,b,*c):
print("a=",a)
print("b=",b)
print("c=",c)
fn(1,2,3,4,5)
# a= 1
# b= 2
# c= (3, 4, 5)
def fn(*, a, b, c):
print("a=", a)
print("b=", b)
print("c=", c)
fn(a=1, b=2, c=3)
def fn(b, c, **a):
print("a=", a)
print("b=", b)
print("c=", c)
fn(b=1, d=2, c=3, e=10, f=20)
# a= {'d': 2, 'e': 10, 'f': 20}
# b= 1
# c= 3
def fn(a, b, c):
print("a=", a)
print("b=", b)
print("c=", c)
t = (10, 20, 30)
fn(*t)
d = {"a": 100, "b": 200, "c": 300}
fn(**d)
def fn():
def fn2():
print("hello")
return fn2()
help(函数对象)
def fn(a:int, b:str, c:bool) ->int:
'''
:param a:作用,类型,默认值...
:param b:作用,类型,默认值...
:param c:作用,类型,默认值...
:return:10
'''
return 10
def fn(a:int, b:str, c:bool) ->int:
表示希望传参的类型 a为int,b为str,c为bool,但是不强制
返回值时int
a = 20
def fn():
a = 10
print("函数内部a=", a)
fn()
print("函数外部a=", a)
# 输出结果
# 函数内部a= 10
# 函数外部a= 20
a = 20
def fn():
global a
a = 10
print("函数内部a=", a)
fn()
print("函数外部a=", a)
# 输出结果
# 函数内部a= 10
# 函数外部a= 10
a = 100
scope = locals() # 当前命名空间
print(scope)
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001CF5B1F6CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:\\developer\\idea\\workspace\\PythonBase\\lesson_05\\code\\06.作用域与命名空间.py', '__cached__': None, 'a': 100, 'scope': {...}}
def fn4():
a = 10
scope = locals() # 函数内部命名空间
print(scope) # {'a': 10}
global_scope = globals() # 全局命名空间
print(global_scope)
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001CF5B1F6CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:\\developer\\idea\\workspace\\PythonBase\\lesson_05\\code\\06.作用域与命名空间.py', '__cached__': None, 'a': 100, 'scope': {...}}
fn4()
#定义阶乘函数
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(4))
练习1
创建一个函数power来为任意数字做幂运算 n**i。
def power(n, i):
if i == 1:
return n
return n * power(n, i - 1)
练习2
创建一个函数,用来检查一个任意的字符串是否是回文字符串。如果是返回True,否则返回False。回文字符串:字符串从前往后和从从后往前都是一样的,abcba。
def check(str):
# 字符串长度小于2,一定是回文
if (len(str) < 2):
return True
# 第一个字符串跟最后一个不一样,不是回文
if (str[0] != str[-1]):
return False
# 递归检查第二个到倒数第二个的子字符是否是回文
return check(str[1:-1])
list = [1, 2, 3.4, 5, 6, 7, 8, 9, 10]
# 检查一个任意数是否是偶数
def fn2(i):
if i % 2 == 0:
return True
return False
# 检查一个任意数是否大于5
def fn3(i):
if i > 5:
return True
return False
# 定义函数:返回一个子列表
def fn(func,list):
new_list = []
for n in list:
if (func(n)):
new_list.append(n)
return new_list
print(fn(fn2,list)) #[2, 6, 8, 10]
print(fn(fn3,list)) #[6, 7, 8, 9, 10]
上面的 print(fn(fn3,list)) 等价于:
print(list(filter(fn2, ls)))
匿名函数lambda
lambda 参数列表:返回值
ls = [1, 2, 3.4, 5, 6, 7, 8, 9, 10]
# 判断奇偶函数
def fn2(i):
if i % 2 == 0:
return True
return False
# fn2改造成lombda
lambda i: i % 2 == 0
r = filter(lambda i: i % 2 == 0, ls)
print(list(r))
# 输出结果
# [2, 6, 8, 10]
map()函数
ls = [1, 2, 3.4, 5, 6, 7, 8, 9, 10]
r = map(lambda i: i + 1, ls)
print(list(r))
# 输出结果
# [2, 3, 4.4, 6, 7, 8, 9, 10, 11]
sort()方法
ls = ["bb", "aaaa", "c", "ddddddd", "fff"]
ls.sort(key=len)
print(ls)
# 输出结果
['c', 'bb', 'fff', 'aaaa', 'ddddddd']
sorted()函数
ls = ["bb", "aaaa", "c", "ddddddd", "fff"]
r = sorted(ls, key=len)
print(ls)
print(r)
# 输出结果
['bb', 'aaaa', 'c', 'ddddddd', 'fff']
['c', 'bb', 'fff', 'aaaa', 'ddddddd']
闭包
def make_avg():
nums = []
def avg(n):
nums.append(n)
return sum(nums) / len(nums)
return avg
averager = make_avg()
print(averager(10))
print(averager(20))
print(averager(30))
#-------------------------
#输出结果
10.0
15.0
20.0