1、什么是函数
具有特殊功能的一段代码的封装
C语言是一门面向过程(功能、函数)的语言
具有名称的一段具体功能代码的统称
函数作用:代码封装、提高代码的复用性、解耦合的作用
2、python中如何定义函数
使用关键字 def # define function
def 函数名称([参数列表]):
# 函数体
# [return 返回值]
调用函数的帮助文档
print(print_msg.__doc__)
print(help(print_msg))
3、函数的调用
函数名称([参数列数])
def show_info(name, age, address, intro):
print("我叫{}, 我今年了{}岁了,我家住在{},我喜欢{}".format(name, age,\
address, intro))
show_info("小明", 12, "黄土高坡", "喜欢小姐姐")
show_info("大明", 20, "东京", "比较冷的东西")
4、函数分类
|-- 定义有没有参数
|-- 无参函数
|-- 有参函数
函数的参数,要根据实际来决定,是否需要参数
|-- 是否有返回值
|-- 无返回值
|-- 有返回值
在函数中,当遇到return关键字的时候,函数会立刻返回
def show(): #无参
print("hell world")
def show_msg(msg): #有参
print("接收到一个信息--->", msg)
def add(x, y):
"""
计算两个数之和
并且将结果返回
"""
res = x + y
return res
# show()
# show_msg("明天是六一儿童节,大家节日快乐,记得给我礼物哦~~~")
num1 = float(input("第一个值:"))
num2 = float(input("第二个值:"))
sums = add(num1, num2)
print("{} + {} = {}".format(num1, num2, sums))
5、全局变量和局部变量
- 全局变量:定义在模块(.py)中,可以在该模块定义后任何地方都可以访问
- 局部变量:定义在函数内部的变量,作用域只是在当前函数内有效,出了函数,无法访问到
- 在函数中,能不能访问到全局变量?
当然可以,但是注意:在python中,函数内不允许修改全局变量
如果确实在函数内,需要修改全局变量,必须要提前申明
global 全局变量 ##需要修改全局变量可以使用global,尽量不用
# 定义一个全局变量
# num = 1000
# def say(count):
# # 如果确实在函数内,需要修改全局变量,必须要提前申明
# global num
# print("hello,函数开始运行了")
# # my_count 是定义在函数内部的变量,局部变量
# # 局部变量的作用域只在当前的函数内有效
# my_count = 5000
# print(num)
# # 数量加1
# num += 1
# print(num)
# return
# say(10)
# print(num)
name = "old wang"
def change_name():
global name
# name = "old pan"
name += " is good man"
print(name)
change_name()
print(name)
6、函数的调用原理
压栈,函数调用本质就是将堆中的函数调用到栈中执行,这个过程被称为压栈,等函数执行完成, 会立刻执行出栈(弹栈)
栈:先进后出(好比手枪弹夹,先压入的后弹出)
7、引用传递和值传递
- 值传递:本质就是传递数据值的拷贝,跟原先的那个值没有关系
- 引用传递:本质是传递指针(地址),所以说实质操作的就是堆
def add_user(users):
users.append("不法狂徒")
users.append("张三")
if __name__ == "__main__":
# python的main函数
# 注意:python的中main,主要作用是写在main中的代码
# 并不会被导入其他模块中
# num1 = 10
# num2 = 30
# 值传递
# num1, num2 = change(num1, num2)
# print(num1)
# print(num2)
# ls是一个列表,对象,存在堆中,ls存储的堆中的地址
ls = ["赵大", "钱七", "王五", "李四"]
add_user(ls)
print(ls)
8、函数的参数问题
|-- 默认值参数
# 默认值参数,在参数上,给定一个最常用的值,在调用的时候,
# 如果和默认的值一致,就可也不用传递这个参数
def get_cricle_area(r, pi=3.14):
pass
注意:默认值参数,必须放在普通后面!!!
|-- 可变参数
def show(name, age=16, *args):#可写可不写称为可变
pass
args以元组的形式保存
|-- # 命名参数(关键字参数)
def show2(name, age, **kwargs):
pass
kwargs是以字典的形式保存
# 默认值参数,在参数上,给定一个最常用的值,在调用的时候,
# 如果和默认的值一致,就可也不用传递这个参数
def get_cricle_area(r, pi=3.14):
return r * r * pi
# 可变参数
def show(name, age=16, *args):
print(name)
print(age)
print(args)
# 命名参数(关键字参数)
def show2(name, age, **kwargs):
print(name)
print(age)
print(kwargs["address"])
print(kwargs.get("height"))
# 万能参数
def show3(name, age, gender, *args, **kwargs):
pass
if __name__ == '__main__':
# print(get_cricle_area(3, 3.14))
# print(get_cricle_area(3, 3.141592))
# print(get_cricle_area(3, 3.1415926535))
# print(get_cricle_area(3))
# print(get_cricle_area(3, 4))
# show("刘建宏", 16, "123456", "男")
show2("刘帅哥", 16, gender="男", address="陕西西安", height=1.89)
9、函数递归
函数自身调用自身
注意:必须要有终止条件,没有终止条件的递归是一个死循环
StackOverflowException
import sys
# python中规定递归默认不能超过1000次
print(sys.getrecursionlimit())
# 修改递归的默认极限值
sys.setrecursionlimit(10000)
def get_sum(n):
# 递归必须要有终止条件,如果没有终止条件,递归就是一个死循环
# 直到栈溢出为止
if n == 1:
return 1
return n + get_sum(n - 1)
res = get_sum(100)
print(res)