1.函数目的
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。
函数可以封装一定的功能
2.函数的定义
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号 : 起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表): 函数体
3.函数的声明
def hello() :
print("Hello World!")
hello()
def max(a, b):
if a > b:
return a
else:
return b
a = 4
b = 5
print(max(a, b))
4.函数的调用
def printme(str):
print(str)
return
# 调用函数
printme("aaaaaa")
printme("cccccc")
5.函数形参与函数实参
形参 在函数定义时出现在函数小扩号中的变量名 形参是一个变量 需要使用实参赋值 实参就是函数调用时小括号中的数值
def wake_up(name,num):
for i in range(num):
print(f"{name}你真不醒的嘛")
# 调用一个函数 函数调用
wake_up("李白",2)
6.函数的返回值
函数内部没有return时 则默认返回None
def my_print():
print(f"李白洗衣液")
print(my_print())
函数内部有return时,函数返回return后的值
def my_print():
print(f"李白洗衣液")
return "libai"
print(my_print())
7.函数的参数类型
1.关键字参数
关键字参数即在调用函数时在括号内直接传入参数值
def wake_up(name,n):
for i in range(n):
print(f"有{name}")
wake_up("朝", 5)
2.默认参数
当构造函数时,有多个形参,直接定下某些形参的值,
def wake_up(name,n=5):
for i in range(n):
print(f"有{name}")
wake_up("朝" )
3.不定长参数
如*args 和**kwargs
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数,可以称它为元组参数
def wake_up(msg,*args):
for name in args:
print(f"{msg} {name} ")
wake_up("下班了","李白","黄一名","张伟")
加了两个星号 ** 的参数会以字典的形式导入,可称其为字典参数它会接收所有除了在形参中出现的关键字参数以外的所有关键字参数
def inim_(n,address="长安",**kwargs):
print(f"{n}在 {address},{kwargs}")
inim_("李白",inqe="唐朝",queu="宋朝")
8.变量的作用域(global与nonlocal)
作用域是程序中定义变量的区域,决定了这些变量可以被访问的位置。通常,作用域分为两种类型:
- 局部作用域:在函数内部定义的变量,只能在该函数内部访问。
- 全局作用域:在函数外部定义的变量,可以在程序的任何地方访问。
global可以将一个变量定义为全局变量,所有函数都可以访问该变量并修改
var = "初始全局变量值"
def modify_global():
global var # 声明global_var为全局变量
var = "修改后的全局变量值" # 修改全局变量的值
# 使用global关键字访问全局变量
def access_global():
global var # 声明global_var为全局变量
print("访问全局变量:", var)
# 调用函数,展示global关键字的使用
modify_global()
access_global()
nonlocal可以让内层函数也使用外层变量而不是将变量定义为一个全局变量
def outer():
outer_var = "外层函数变量"
def inner():
nonlocal outer_var # 声明outer_var为非局部变量
outer_var = "声明后内层函数也可访问外层函数的变量" # 修改外层函数的变量
inner()
print("外层函数访问修改后的变量:", outer_var)
# 调用外层函数,展示nonlocal关键字的使用
outer()
9.递归函数
递归的基本概念
递归函数是指在函数体内调用自身的函数。递归包含两个主要部分:
- 基本情况(Base Case):递归结束的条件,防止无限递归。
- 递归步骤(Recursive Step):函数调用自身的部分,每次调用都向基本情况靠近。
递归的使用场景
递归通常用于解决可以分解为相似子问题的问题,例如:
- 数学计算,如阶乘、斐波那契数列。
- 数据结构的遍历,如树和图的遍历。
- 搜索和排序算法,如快速排序和归并排序。
- 图论问题,如最短路径和路径寻找。
递归函数的实现要点
- 明确基本情况:确保递归有明确的结束条件。
- 确保递归逻辑正确:每次递归调用都应该使问题规模减小,逐步接近基本情况。
- 避免重复计算:在可能的情况下,使用记忆化递归或迭代来减少计算量。
计算阶乘
阶乘是递归的经典例子。n
的阶乘定义为n * (n-1) * ... * 1
,其中0
的阶乘为1
。
def factorial(n):
# 基本情况
if n == 0:
return 1
# 递归步骤
else:
return n * factorial(n - 1)
# 测试阶乘函数
print(factorial(5)) # 输出: 120
斐波那契数列
def fibonacci(n):
# 基本情况
if n <= 1:
return n
# 递归步骤
else:
return fibonacci(n - 1) + fibonacci(n - 2)
# 测试斐波那契函数
print(fibonacci(6)) # 输出: 8
10.匿名函数
匿名函数是一种无需定义标识符(名称)的函数或子程序。它们通常用于需要一个函数对象的场合,但函数体只使用一次,无需正式定义一个完整的函数。
- 简化代码:在需要简单函数对象时,使用匿名函数可以使代码更加简洁。
- 提高可读性:在函数逻辑简单且明确的情况下,匿名函数可以提高代码的可读性。
- 临时使用:在需要临时函数对象的场合,如排序、映射或过滤操作。
lambda 形参列表 : 单行表达式
1.使用lambda表达式进行简单的数学运算:
add = lambda x, y: x + y
print(add(5, 3)) # 输出: 8
2.使用lambda表达式作为sorted()
函数的键函数
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# 降序排序
print(sorted(numbers, key=lambda x: -x)) # 输出: [9, 6, 5, 4, 3, 2, 1, 1]
3.使用lambda表达式对字典按照值进行排序:
data = {'apple': 10, 'orange': 20, 'banana': 5, 'grape': 15}
# 按值降序排序
print(sorted(data.items(), key=lambda x: x[1], reverse=True))
# 输出: [('orange', 20), ('grape', 15), ('apple', 10), ('banana', 5)]
11.闭包
闭包是一个函数,它记住了创建时的环境,包括外部作用域中的变量。这意味着即使外部函数已经执行完毕,闭包仍然可以访问这些变量。
闭包由两部分组成:
- 函数:闭包本身是一个函数。
- 环境:闭包可以访问创建时的外部作用域中的变量。
闭包常用于以下场景:
- 封装数据:保护数据不被外部直接访问。
- 延迟计算:在需要时才执行计算。
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter())
print(counter())
print(counter())
import random
def fun1():
datas = []
def fun2():
datas.append(random.randint(0, 100))
print("fun2", datas)
return fun2
r = fun1()
r()
r()
r()
r()
标签:return,函数,python,global,基础,var,print,def
From: https://blog.csdn.net/dhudhj/article/details/140475359