python基础学习day6-函数01

python基础学习day6-函数用法和底层分析01

一、函数的基本概念
1.一个程序由一个个任务组成;函数就是代表一个任务或者一个功能。
2.函数是代码复用的通用机制。
python函数可大致分为:内置函数、标准库函数、第三方库函数、用户自定义函数。本章内容就是学习如何自定义函数。用

def 函数名([参数列表]):
函数体/若干语句
二、形参和实参
在函数定义中的参数列表中,括号内可以是形式参数列表,有多个参数的用逗号隔开,形式参数是在定义函数时使用的,“形参”只需要符合“标识符”命名规则即可。在调用函数时,传递的参数称为“实际参数”,简称“实参”。

例:代码:

#定义一个函数,实现两个数大小的比较

def MAX(a,b):#定义函数MAX(a,b),其中的a,b为形式参数,只需要满足”表标识符的命名即可
    if a>b:
        print("较大值:",a)
    else:
        print("较大值:",b)
MAX(30,60)
MAX(60,90)#在调用函数所使用的参数成为实际参数,简称“实参”。

运行结果:
在这里插入图片描述

三、返回值
return返回值要点:
1、如果函数中包含return语句,则结束函数执行并返回值;
2、如果函数体中不包含return语句,则返回None值;
3、要返回多个返回值,使用列表、元组、字典、集合将多个值“存起来”即可。
例:

#定义一个打印n个*号的无返回值的函数
def print_star(n):
    print("*"*n)

print_star(5)
#定义一个返回两个数平均值的函数
def my_avg(a,b):
    return (a+b)/2
#函数调用
c=my_avg(3,5)
print(c)

运行结果:在这里插入图片描述
四、全局变量和局部变量
变量起作用的范围称为变量的作用域。
全局变量:在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束,一般做常量使用,函数内要改变全局变量的值,使用global声明。
局部变量:在函数体中声明的变量(包含形式参数),局部变量的引用别全局变量快,有限考虑使用,如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量。

#全局变量的作用域测试
a=300
def f():
    global a#在函数体内改变全局变量的值,增加global关键字声明
    print(a)#打印全局变量a的值
    a=100
f()
print(a)

运行结果:
在这里插入图片描述

#全局变量和局部变量的同名测试
a=300
def f():
    a=5#同名的局部变量
    print(a)#局部变量
f()
print(a)#全局变量

运行结果:
在这里插入图片描述
局部变量和局部变量的效率测试
代码:

#测试局部变量、全局变量的效率
import math
import time

def f1():
    start=time.time()
    for i in range(10000000):
        math.sqrt(30)
    end=time.time()
    print("耗时{0}".format((end-start)))

def f2():
    b=math.sqrt#用变量代替全局变量后,效率变高
    start = time.time()
    for i in range(10000000):
        b=(30)
    end = time.time()
    print("耗时{0}".format((end-start)))

f1()
f2()

运行结果:在这里插入图片描述
五、浅拷贝和深拷贝
“浅拷贝和深拷贝”可以使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。
浅拷贝:不拷贝对象的内容,只拷贝子对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。
例:

#测试浅拷贝和深拷贝
import copy
def testcopy():
    a=[10,20,[5,6]]
    b=copy.copy(a)#测试浅拷贝
    print("a",a)
    print("b",b)
    b.append(30)
    b[2].append(7)#浅拷贝对子对象改变后,被拷贝对象的子对象改变。
    print("a", a)
    print("b", b)

def testDeepcopy():
    a = [10, 20, [5, 6]]
    b = copy.deepcopy(a)
    print("a", a)
    print("b", b)
    b.append(30)
    b[2].append(7)#深度拷贝对子对象改变后,被拷贝对象的子对象不变。
    print("a", a)
    print("b", b)
testcopy()
print("**********")
testDeepcopy()

运行结果:
在这里插入图片描述
六、传递不可变对象包含的子对象是可变的情况
传递不可变对象时,不可变对象里面的子对象是可变的,对子对象进行修改后,原对象也发生了改变。
例:

a=(10,20,[5,6])
print("a:",id(a))
def t01(m):
    print("m:",id(m))
    m[2][0]=40#对可变子对象修改
    print(m)
    print("m:",id(m))
t01(a)
print(a)#原对象也发生了变化

运行结果:在这里插入图片描述
七、参数的类型
例:

#位置参数,按默认位置顺序传递,需要个数和形参匹配
def t1(a,b,c):
    print(a,b,c)
t1(1,2,3)


#设置默认值参数,这样参数在传递时就是可以选择的,默认值参数放到位置参数后面。
def t1(a,b,c=10,d=20):
    print(a, b, c,d)
t1(8,9)
t1(8,9,20)
t1(8,9,30,40)

#命名参数
def t1(a,b,c):
    print(a, b, c)
t1(a=1,b=2,c=3)#直接定位到指定参数上

#可变参数,*p(一个星号收集元组对象中),**p两个星号收集到字典对象中
def t1(a,b,*c):
    print(a, b, c)
t1(10,20,20,30)

def t2(a,b,**c):
    print(a, b, c)
t2(1,2,name="sussu",age=18)
#可以复合使用

运行结果:在这里插入图片描述
八:递归函数
自己调用自己的函数,在函数体内部直接或间接的调用自己。
1、终止条件:表示递归什么时候结束。一般用于返回值,不再调用自己。
2、递归步骤:把第n步的值和第n-1步相关联。
例:

#测试递归函数
def test01(n):
    print("tset01:",n)
    if n==0:
        print("over")
    else:
        test01((n-1))#n逐渐减少1
    print("test****:",n)#执行完递归函数后倒叙输出n的最终值

test01(4)

运行结果:在这里插入图片描述
使用递归函数计算函数阶乘:

#使用递归函数计算阶乘(factorial)
def factorial(n):
    if n==1:
        return 1
    else:
        return n*factorial(n-1)
for i in range(1,6):#注意阶乘从1开始循环
    print(i,"!=",factorial(i))

运行结果:在这里插入图片描述
函数内容的第一部分,学习python的第6天,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值