1、函数
——C语言是一门面向过程的语言,函数就是行为、就是动作、就是功能、就是过程
——完成一定功能的代码块
2、python如何定义函数
——关键字 def——defined function(定义函数)
——函数名称的命名规范:和变量命名规范一致(下划线法,见名知意等)
def 函数名称(形式参数):#形式参数可有可无
代码1
代码2
......
代码n
return 返回值#return可有可无
3、函数的分类
是否存在返回值:
——有返回值的函数,使用return关键字返回结果,函数遇到return关键字,则立刻返回
——无返回值的函数
是否存在参数:
——有参函数:
1、参数的个数,根据情况任意,
2、参数的类型,是任意类型
——无参函数
函数由谁定义
——系统函数:
由官方定义的函数,如print()、input()、type()等
——第三方模块:
第三方(公司等)定义,需要安装这些模块,才能使用,在以后的内容会讲到
——pip install 模块名称
——pip(python install package)
——自定义函数:
我们写的函数,注意:(函数、变量……)命名时一定要注意,和系统的全局函数不要冲突!!(会覆盖掉原来的系统函数或者常见类型,比如变量定义不能是list)
4、全局变量和局部变量
全局变量:
——直接定义在py(模块)文件中的变量,一般定义在函数之外,不属于任何函数
局部(本地)变量:
——定义在函数内部的变量叫做局部变量,作用域在函数内部,在函数外部不能访问
注意:
——全局变量在函数直接访问,可以正常访问,但不能修改值,python不让修改
——如果要一定强制改呢?在函数的第一行,用global关键字声明需要修改全局变量
def 函数名称(形式参数):#形式参数可有可无
global 全局变量名
代码1
代码2
......
# 全局变量和局部变量
msg = "这个是全局变量"
def test():
# 局部变量只能在函数内部使用,外界是无法访问的
box = "这个是函数内部的变量"
# 全局变量可以在任何位置访问到,包括函数内部
print(msg)
print(box)
test()
age = 10
def show_info(name):
# 声明需要修改全局变量
global age
address = "陕西西安"
age += 1
print("我的名字是:", name)
print(f'今年{age}岁了')
print("我家在{}".format(address))
show_info("张三")
#print(address)#地址不能正常打印,函数内的参数,在外部不能访问
5、函数的调用
函数调用的本质(压栈、弹栈),函数本质就是一个对象
——压栈(push):将函数从堆内存中放到栈中执行
——弹栈(pop):函数执行完成后出栈内存
引用传递和值传递:
——引用传递:传递的是对象的地址(引用的含义),在传递4种容器(列表、集合、元组、字典、函数名)时,传递的是地址
——值传递:传递的是值
def change(ls):
ls.append(100)
ls.append(100)
# ls是对象,列表
ls = [1,2,3,4,5,6]
change(ls)
print(ls)#在列表后面添加两个值100的元素
6、函数参数:
普通参数:和其他编程语言类似,在形参中不进行操作
默认值参数:
——该参数,在大多数情况下,值是固定的一个值,此时可以使用默认值参数,如果不传该参数,值就取默认的,如果传递了,则按照传递的算
——注意:默认值参数,一定要写在普通参数之后
def test(radius,pi = 3.14):
zhouchang = 2 * pi * radius
mianji = radius **2 *pi
print(zhouchang)
print(mianji)
可变参数:
——在python,如果函数中参数可能有很多(参数可有可无),建议将这种参数设置为可变参数
def 函数名(普通参数,*args):#习惯性可变参数取名args
代码块
#注意:可变参数默认是以元组封装所有参数
def test(x, y, *args):
print(x)
print(y)
print(args)
命名(关键字)参数:
——规定了名称的参数(可有可无),例如print()的关键字参数print(“你好呀”,end="\n")默认是回车,可以通过给end赋值改变最后的操作
def 函数名(普通参数,**kwargs):#习惯性关键字参数取名kwargs
代码块
#注意:关键字参数默认是以字典封装所有参数
# 关键字参数
def test(a, b, **kwargs):
print(a, b)
print(kwargs)
test(10, 20, name="张三", age=16, gender="男")
参数的一般顺序:(普通参数,默认值参数,可变参数,关键字参数)只能依次匹配,不可跳过前面的参数给后面的赋值
def test03(a, b=20, *args, **kwargs):
print(a, b)
print(args)
print(kwargs)
test(20,14,12,3,43,34,34,name="张三")
7、函数递归:
——假装问题已经解决,无线套娃,自己调用自己,最终解决问题
——函数是递归函数的两个条件:
——1、函数自身调用自身
——2、一定要有终止条件!!(否则是一个死循环)
注意:python中,不允许递归超过1000次,当然如果一定要调整,可以使用如下代码:
import sys
# 获取递归限制次数
sys.getrecursionlimit()
# 重新设置递归限制次数
sys.setrecursionlimit(10000)#设置递归限制次数10000次
从斐波那契数列谈递归:
——高中我们知道斐波那契数列:1,1,2,3,5,8,13,…从第三项开始,最后一项是前两项的和,那么如果想知道第n个数是多少该怎么想呢?
——可以假设问题已经解决了,即已经知道第n-1和第n-2个数,然后相加就可以了,可以定义一个函数来进行计算
——那么实际上我们并不知道前面的第n-1和第n-2个数,但是我们可以调用定义好的函数,计算前两个数,这就是递归的思想
——最前面的两个数1,1是已知的,这个就是递归函数的终止条件
——整个过程类似于:
第一次,(an-1)+(an-2)
第二次,(an-2+an-3)+(an-3+an-4)
第三次,(an-3+an-4)+(an-4+an-5)+(an-4+an-5)+(an-5+an-6)
…
def fibonacci(n):
if n == 1 or n = 2:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
n = int(input(请输入n的值:))
print(fibonacci(n))
#n值不能过大,不然,栈,boom
本人第一次接触python,水平有限,如有错误请大家给予指正,谢谢大家