目录
????????函数是一段可重用的代码,可以在程序的不同位置调用多次。函数是方法,使用 def
关键字进行定义,拥有一定的功能,对功能实现进行封装,目的:提高代码的复用,减少代码的重复编写。
????????命名规则等同于变量名
def 函数名(参数1, 参数2, ...):
"""
函数文档字符串
"""
# 函数体代码
return 返回值
????????def 函数名(): ?pass
def add_numbers(a, b=0):
"""
将两个数字相加并返回结果
"""
return a + b
????????函数名()
def wakeup():
"""
这是一个叫醒服务函数
"""
print("醒醒了")
wakeup()
????????形参是形式参数,函数声明中的()中,没有固定值,让函数功能更加灵活。实参是实际参数,出现在函数的调用中的()中,让函数功能更强大。调用函数时 将实参赋予形参。
def sleep(name):
print(f"睡觉吧,{name}")
sleep("XX")
????????函数的运算结果,默认返回None,可以通过return 将结果返回,return 直接终止函数,后续代码不会执行,return 可以有多个返回值,最终将多个返回值放入一个元组。
def my_max(first, second):
"""
比较大小的函数
:param first: 第一个形参
:param second: 第二个形参
:return: 返回值 计算结果
"""
max_value = first if first > second else second
return max_value
r = my_max(5000,1000)
print(r)
????????求1000以内相差为6的质数对
def get_prime_pairs(start, stop, step):
for i in range(start, stop+1-step):
for j in range(2, i):
if i % j == 0:
break
else:
for k in range(2, i+step):
if (i+step) % k == 0:
break
else:
print(i, i+step)
get_prime_pairs(2, 1000, 6)
def is_prime(n):
"""
判断n是不是质数
:param n: 判定数
:return:True是质数 False是质数
"""
for i in range(2,n):
if n % i == 0:
return False
else:
return True
def get_prime_pairs(start, stop, step):
"""
判断质数对
:param start: 开始
:param stop: 结束
:param step: 步长
:return: 返回质数对列表
"""
result = []
for i in range(start, stop+1-step):
if is_prime(i) and is_prime(i+step):
result.append((i, i+step))
return result
r = get_prime_pairs(2,980,6)
print(r)
????????步过(F8):在使用调试器时,按下F8键来执行当前行并继续到下一行,这称为步过操作。步过操作会让程序执行一行代码,但不会进入函数内部。
????????恢复(F9):按下F9键可以从断点处恢复程序的正常执行,即跳过当前断点并继续执行后续代码。
????????步入(F7):在使用调试器时,按下F7键可以执行当前行并进入函数内部,这称为步入操作。步入操作会让程序进入到当前行对应的函数内部,以便你可以逐行调试函数内的代码。
????????步出(Shift +F8):按下Shift + F8键可以从当前函数内部退出,并返回到调用该函数的位置,这称为步出操作。步出操作会让程序跳出当前函数,继续执行调用该函数的上一级代码
????????变量的作用域指的是变量在程序中的可访问范围。在不同的位置,变量可能具有不同的作用域。不推荐在循环外部使用循环内部定义的局部变量,在函数外部不能使用函数内部定义的局部变量,如果变量已经被解释器解释或者赋值,即代表着函数内部声明了一个新的变量,新的变量和外部变量同名,函数执行结束内部变量销毁,那么函数内部可以获取函数外部变量。
def f3():
# 情况1 认为a是外部变量可以获取
print(a)
# 情况2 因为后续有a的赋值,所有认为a尚未赋值直接使用,报错
print(a)
a = 10
# 情况3 a不是修改函数变量,而是函数内部一个新变量赋值20,函数结束,此变量消失
a = 10
print(a)
# 情况4 使用关键字global声明使用的函数就是外部变量a
global a
a = 10
print(a)
f3()
print(a)
????????按照位置将实参赋值给形参
def f1(a, b):
print(a, b)
f1(10,20) # 10 20
????????形参有默认值,调用时可以没有实参;如果调用时传递参数,就是传递的实参,将实参;放在最后
def f1(a, b, c=50, d=100):
print(a, b, c, d)
f1(50,100,150,200) # 50 100 150 200
????????通过指定将实参赋值给形参,要求没有默认值的形参必须赋值
def f1(a, b, c=50, d=100):
print(a, b, c, d)
f1(50,100,d=400)
????????可以接受任意个数的参数,类型为元组
def f1(a, b, c, *args):
print(a, b, c, args)
f1(10,20,30,40,50,60,70) # 10 20 30 (40, 50, 60, 70)
????????可以使用关键字赋值,关键字不能是真实的参数
def f1(a, b, c, *args, **kwargs):
print(a, b, c, args, kwargs)
f1(10,20,30,40,50,e=60,j=70) # 10 20 30 (40, 50) {'e': 60, 'j': 70}
?????????lambda 只支持简单,基础格式,一般不能独立存在,需要作为实参赋予函数的形参
l = [{"name":"a","age":20},{"name":"b","age":10},{"name":"c","age":30}]
print(max(l,key=lambda e:e['age'])) # {'name': 'c', 'age': 30}
l.sort(key=lambda e:e['age'])
print(l) # [{'name': 'b', 'age': 10}, {'name': 'a', 'age': 20}, {'name': 'c', 'age': 30}]
????????自己调用自己,必须有递归出口,不是高性能,能不用就不要,有深度限制
import sys
sys.getrefcount() # 获取最大递归深度
sys.setrecursionlimit(2000) # 修改最大递归深度
????????1.计算1+2+3+...+100
def f(n):
if n == 1:
return 1
else:
return n + f(n-1)
r = f(100)
print(r) # 5050
????????2.计算5!=5*4*3*2*1
def f(n):
if n == 1:
return 1
else:
return n * f(n-1)
r = f(5)
print(r) # 120
????????3.编写函数返回斐波那契数列的第n个数(1,1,2,3,5,8,13,21,34,....)
def f(n):
if n == 1 or n == 2:
return 1
else:
# 当前数字n等于其前两个数字的和
return f(n-1) + f(n-2)
r = f(6)
print(r) # 8