#___author:
#date: 2021/6/12
'''''
python函数的分类
#python中函数分为如下几类:
1.内置函数
像str() list() len()等这些是内置函数,不用调用可以直接使用
2.标准库函数
通过import语句导入的库,然后使用其中定义的函数
3.第第三方库函数
python社区也提供了很多高质量的库,下载安装这些库后,也是通过import
的语句导入,然后可以使用这些第三方库的函数
4.用户自定义函数
用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数,
'''''
'''''
函数的定义和调用
def 函数名 ([参数列表]):
文档字符串
函数体/若干语句
'''''
'''''
def tsmt01 ():
print('*'*20)
print('@'*20)
print(id(tsmt01))
print(type(tsmt01))
print(tsmt01)
tsmt01()
for i in range(1):
tsmt01()
'''''
'''''
#形参和实参
def tsmt1(a,b): #x形参
if a>b:
print(a,"较大值")
else:
print(b,"较大值")
tsmt1(1,2)#实参
def prin_star(n):
根据传入的n,打印多个*号
print('*'*n)
help(prin_star.__doc__) #调用help(函数名._doc_)可以打印输出函数的文档字符
prin_star(10)
'''''
'''''
#返回值 return() 两个作用1.返回值2.结束函数的执行
def my_vge(a,b):
return (a+b)/2
c = my_vge(20,80)
print(c)
def tsmt01(x,y,t):
return [x*10,y*10,t*x] #用列表返回多个值
d = tsmt01(10,20,30)
print(d)
'''''
'''''
#函数也是对象,内存底层分析
def tsmt1(n):
print("*"*n)
tsmt1(5)
a = tsmt1 #函数也可以当对象
a(5)
print(id(tsmt1))
print(id(a))
print(type(a))
'''''
'''''
#变量的作用域(全局变量和局部变量)
a = 10 #全局变量,不定义在函数内的变量
def tsmt01():
b = 20
global a #如果在函数内改变全局变量的值,增加global关键字声明
print(a*a)
a = 20 #局部变量,定义在函数内变量
print(a*a)·
print(locals()) #打印输出的局部变量
#print(globals()) #打印输出的全局变量
tsmt01()
'''''
'''''
#局部变量和全局变量效率测试
import math
import time
def tsmt01():
tsmt1 = time.time()
for i in range(10000000):
math.sqrt(30) #开平方运算
tsmt2 = time.time()
print("耗时{0}".format(tsmt2-tsmt1))
def tsmt02():
tsmt3 = time.time()
b = math.sqrt
for i in range(10000000):
b(30)
tsmt4 = time.time()
print("耗时{0}".format(tsmt4-tsmt3))
tsmt01()
tsmt02()
'''''
'''''
#传递可变对象的引用
#可变对象有:字典,列表,集合和自定义的对象
a = [10,20,30]
def tsmt01(b):
print("b",id(b))
b.append(40)
tsmt01(a)
print("*"*30)
print("a",id(a))
print(a)
'''''
'''''
#传递不可变对象的引用
#不可变对象:数字 字符串,元组 ,function等
a=100
def tsmt01(n):
print("n",id(n))
n = n+100
print("n", id(n))
print(n)
tsmt01(a)
print(id(a))
'''''
'''''
#浅拷贝和深拷贝
#copy(浅拷贝):不拷贝子对象的内容,只是拷贝子对象的引用
#deepcopy(深拷贝):会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象
import copy
a = [10,20,[1,2]]
# 测试浅拷贝
def tsmt01(n):
b = copy.copy(n)
print("a:",a)
print("b:",b)
b.append(30)
b[2].append(3)
print("浅拷贝***********")
print("a:",a)
print("b",b)
tsmt01(a)
#测试深拷贝
print("*"*50)
c = [10,20,[1,2]]
def tsmt02(n):
b = copy.deepcopy(n)
print("a:",c)
print("b:",b)
b.append(30)
b[2].append(3)
print("深拷贝","*"*20)
print("a:",c)
print("b",b)
tsmt02(c)
#传递不可变对象时,如果发生拷贝,是浅拷贝
p = (1,2,[1,2])
print("a:",id(p))
def tsmt03(c):
print("a:",id(c))
c[2][0] = 80
print("a:",id(c))
tsmt03(p)
print(p)
'''''
#参数的几种类型
#位置参数
def tsmt1(a,b,c):
print(a,b,c)
tsmt1(1,2,3) #位置参数
#默认值参数
def tsmt2(a,b,c=10,d=20):
print(a,b,c,d)
tsmt2(22,23)
tsmt2(25,54,88) #默认值参数
tsmt2(55,85,46,78)
#命名参数
def tsmt3(a,b,c):
print(a,b,c)
tsmt3(c=100,b=20,a=60) #通过形参名称匹配
#可变参数
#可变参数是指“可变数量的参数”,有两种情况
#1.*param(一个星号),将多个参数收集到一个“元组”对象中。
#2.**param(两个星号),将多个参数收集到一个“字典”对象中。
def f1(a,b,*c): #*param(一个星号),将多个参数收集到一个“元组”对象中。
print(a,b,c)
f1(8,10,19,20)
def f2(a,b,*c,**d): #**param(两个星号),将多个参数收集到一个“字典”对象中。
print(a,b,c,d)
f2(12,254,264,21,name="yangzheng",age=18)
#强制命名参数
def f3(*a,b,c):
print(a,b,c)
f3(1,2,4,b=32,c=26)