函数与方法的区别:
直接调用的是函数
同过对象点出来的是方法
nums = [1, 2, 3]
print(len(nums)) # 函数
nums.append(4) # 方法
案例
def helo():
print('hai')
helo()
函数的参数传递
通常情况下,定义函数时都会选择有参数的函数形式,函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。
在使用函数时,经常会用到形式参数(简称“形参”)和实际参数(简称“实参”),二者都叫参数,之间的区别是:
形式参数:在定义函数时,函数名后面括号中的参数就是形式参数:
#定义函数时,这里的函数参数 obj 就是形式参数
def demo(obj):
print(obj)
实际参数:在调用函数时,函数名后面括号中的参数称为实际参数,也就是函数的调用者给函数的参数:
a = "Zking"
#调用已经定义好的 demo 函数,此时传入的函数参数 a 就是实际参数
demo(a)
这里给与两个列举
# 注意:方法名称定义不要使用驼峰命名,请使用下划线方法
# 错误方式:getUser()
# 正确方式:get_user()
ef get_user(name):
print(f"输入内容:{name}"
get_user('张三')
def add(a, b):
return a + b
print(add(1,2))
注意的是python 的函数可以传递任何参数,传递参数时要注意函数内的代码,字符串于数字是不可以进行直接运算的
传参的几种情况
位置传参
res(1, 2)
关键字传参
res(a=1, b=2)
res(b=10, c=5)
缺省传参
可以给参数设置默认值,当你使用此函数时如果参数没有输入那它就会是默认参数
def add(a: int, b: int = 10):
return a + b
print(add(1))
可变参数
单个*号的可变参数方式,传入得到的是一个元组。
def my_max(*nums):
print(nums)
val = nums[0] # 获取第一个元素
for i in nums[1:]: # 通过切片的方式排除掉第一个元素
val = val if val > i else i # 通过三元运算符比较最大值
return val
print(my_max(1, 2, 3))
两个**号的可变参数方式,传入得到的是一个字典。
def my_max(**nums):
print(nums)
val=0
# for i in nums.values(): # nums.values()获取字典中所有的值
# for i in nums.keys(): # nums.keys()获取字典中所有的键
# for i in nums.items(): # num.items()获取字典中的键值对,元组方式
# print(f'items:{i},key:{i[0]},value:{i[1]}')
for k,v in nums.items(): # num.items()获取字典中的键值对,分别获取k和v
print(f"key={k},value={v}")
# 错误方式:
# my_max(1,2,3,4,5)
# 正确方式:
my_max(a=1,b=2,c=3)
函数的返回值
Python中,用 def 语句创建函数时,可以用 return 语句指定应该返回的值,该返回值可以是任意类型。需要注意的是,return 语句在同一函数中可以出现多次,但只要有一个得到执行,就会直接结束函数的执行。
Python 函数可以返回多个值,多个值以元组的方式返回(也可以通过字典返回自定义结果):
def res(*nums: int):
max = nums[0]
min = nums[0]
sum = nums[0]
for i in nums[1:]:
max = max if max > i else i
min = min if min < i else i
sum += i
#return sum, min, max # 元组方式返回
return { # 字典方式返回
'总和': sum,
'最大值': max,
'最小值': min
}
print(res(1, 2, 3, 4, 5, 6, 7, 8, 9))
函数的注释
其实,函数的注释(说明文档),本质就是一段字符串,只不过作为说明文档,字符串的放置位置是有讲究的,函数的说明文档通常位于函数内部、所有代码的最前面。
def add(a, b):
"""
返回两个数相加的和
:param a: 参数数字a
:param b: 参数数字b
:return: 和
"""
return a + b
函数嵌套
def a(a, b):
return a + b
def b(c, d):
return a(c, d) / 2
print(b(4, 8))
变量作用域
所谓作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。
变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。
在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能使用了,我们将这样的变量称为局部变量(Local Variable)。
def demo():
add = "zking"
print("函数内部 add =",add)
demo()
print("函数外部 add =",add)
-
除了在函数内部定义变量,Python 还允许在所有函数的外部定义变量,这样的变量称为全局变量(Global Variable)。
add = "zking"
def text():
print("函数体内访问:",add)
text()
print('函数体外访问:',add)
递归
计算n+1的和
def res(target: int):
if target == 1:
return 1
return target + res(target - 1)
print(res(2))
示例:斐波那契数列
# 1,1,2,3,5,8,13,21,34,55,...
def fb(target: int):
if target == 1 or target == 2:
return 1
return fb(target - 1) + fb(target - 2)
print(fb(10))
lambda表达式
lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。
lambda 表达式的语法格式如下:
lambda 参数 : 执行操作/返回值
示例:
# 未简写方式:
def res():
return 10
# 简写方式:
res1 = lambda: 10
def res(a):
return a+10
print(res(1))
res2=lambda a:a+10
print(res2(10))
def res(a,b):
return a if a>b else b
res3=lambda a,b: a if a>b else b
print(res3(10,5))
使用 lambda 对字典数据进行排序
nums=[1,6,5,2,3,4]
nums.sort() #升序
nums.sort(reverse=False) #降序
print(nums)
persons = [
{"name": "张三", "age": 20},
{"name": "李四", "age": 17},
{"name": "王麻子", "age": 21}
]
persons.sort(key=lambda p:p["age"],reverse=True)
print(persons)
将一个元素中所有的值翻倍 map
nums=[1,2,3,4,5,6,7,8]
m=map(lambda a:a*2,nums)
for i in m:
print(i)
让列表中的对应位置进行相加
nums1=[1,2,3,4,5,6,7,8]
nums2=[2,3,4,5,6,7,8,9]
m1=map(lambda a,b:a+b,nums1,nums2)
for i in m1:
print(i)
对列表进行筛选
nums3=[1,2,3,4,5,6,7,8]
f=filter(lambda a:a>5,nums3)
for i in f:
print(i)