第八章 Python的函数
#函数
print()
a = 1.123456
result = round(a,2) #结果保留小数点后两位。执行四舍五入
print(result)
#如何查看一个内置函数的功能?
# 在IDLE里 使用help( ) 括号里添上要查的函数名称即可
函数的功能:
1.功能性
2.隐藏细节
3.避免重复的编写代码
组织代码。自定义函数
8-2 函数的定义及运行特点
'''
自定义函数
def funcname(parameter_list): # 函数体
pass
1.参数列表可以没有
2.在函数体里面可以使用return,来返回函数的结果。若函数体里没有return,默认返回None
return 后面不执行
编写一个函数:
1.实现两个数字的相加
2.打印输入的参数
def add(x,y):
result = x + y
return result
def print_code(code):
print(code)
a = add(1,2)
b = print_code('python')
print(a,b)
'''
![1524732128529.jpg](https://upload-images.jianshu.io/upload_images/11154655-d10bf0536a13195b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码运行的时候,执行到a的时候,并没有被打印出来,运行到b ,就会去调用函数,所以先出现Python,print(a,b)出现3和none,3是函数调用的结果,none是因为定义的函数里没有return,默认返回None
![1524732128529.jpg](https://upload-images.jianshu.io/upload_images/11154655-d9a9feddf7b689d9.
8-3 如何让函数返回多个结果
#如何return两个值?
#R Skill1 Skill2
def damage(skill1,skill2):
damage1 = skill1*3
damage2 = skill2*2 + 10
return damage1,damage2 #没有必要加上括号,此种形式的结果输出就是元组
skill1_damage, skill2_damage = damage(3,6) # 序列解包(函数的调用)
print(skill1_damage,skill2_damage)
#print(type(damages))
8-4 序列解包与链式赋值
#什么是序列解包?
赋值的方式:
a = 1
b = 2
c = 3
也可以:a,b,c = 1,2,3
d = 1,2,3
print(type(d)) #打印结果就是序列类型
a,b,c = d #把一个序列d拆成了这样的3个值,就叫做序列解包
a,b,c = [1,2,3]
d = 1,2,3 #序列解包的过程
a,b,c = d
python入门与进阶补充
本章主要补充函数 的相关知识
def name():#定义一个无参数的函数,只是通过这个函数打印
print('xiaoyu')#缩进4个空格
name() #调用函数,打印结果
def add(x,y): #定义一个函数
return x + y
result = add(2,3) # 此时的add是一个对象,只有对象才有类型,并且是一个function类
print(result)
8-5 必须参数与关键字参数
函数的参数:
1.必须参数
def add(x,y):
#x y 形式参数 形参
result = x + y
return result
def print_code(code):
print(code)
a = add(1,2)#实际参数 实参
b = print_code('python')
print(a,b)
2.关键字参数 意义在于代码的可读性
def add(x,y):
result = x + y
return result
c = add(y=3,x=2)#关键字参数,就是在调用的时候,明确指定想用的参数值到底是给哪个
3.默认参数
def print_student_files(name,gender='男',age='8',college='人民路小学'):#默认参数的设置
print('我叫' + name)
print('我今年' + str(age) + '岁')#字符串不能喝int类型相加,所以把age转化成str类型
print('我是' + gender + '生')
print('我在' + college + '上学')
print_student_files('小鱼','男',8,'人民路小学')
print('--------------------------------')
print_student_files('小鱼') #默认参数起到作用了
#对于大多数学生只要输入姓名就行了,其他的都是一样的,所以使用默认参数设置好以后,直接打印即可。
print('--------------------------------')
#如果出现性别和年龄是个别的,就在实参里改动即可,默认参数不要动
print_student_files('喜小乐','女',16)
#原则如下:
# 定义函数的开始,把默认值赋值给形参,上面给了3个默认参数,也可以更改的
# 调用规则,如果有形参没有设置默认值,调用的时候就必须要传实参
print('-------------------------')
print_student_files('果果',age = 17,college='光明路小学')
#必须加上age=17,因为参数之间一一对应,如果不写age,默认对应的是性别,所以age不能少
# 关键字参数可以不遵守顺序
# 默认参数和必须参数不能混合调用
8-7 可变参数
def demo(*param):# * 是用来定义一个可变参数的列表
print(param)
print(type(param))
demo(1,2,3,4,5,6,7,8)
# 如果想直接传递一个元组怎么办?demo((1,2,3,4,5,6,7,8))这个方法是错误的,打印结果是二维元组
# 看看正确的打开方式
def demo(*param):# * 是用来定义一个可变参数的列表
print(param)
print(type(param))
a = (1,2,3,4,5,6,7,8)
demo(*a) #不能直接传a,直接传a就是二维元组,所以在a前面要加上一个*
# *a 的作用就是a元组里面的每一个元素平铺出来,传递到可变参数的函数里面
# 可变参数也可以和必须参数混合使用,但是必须参数必须放在可变参数前面,默认参数也是这样
# 看看下面的例子
def demo(param1,param2=2,*param):
print(param1)
print(param2)
print(param)
demo('a',1,2,3)
def demo(param1,*param,param2=2):
print(param1)
print(param)
print(param2)
demo('a',1,2,3,'param')
def demo(param1,*param,param2=2):
print(param1)
print(param)
print(param2)
demo('a',1,2,3,param2='param')
看看最后3段代码带来的结果
8-8 关键字可变参数
def squsum(*param): #可变参数
sum = 0
for i in param:
sum +=i * i
print(sum)
squsum(1,2,3,4,5,6)
# 举个例子,如果想要知道全国任意城市的温度,怎么编程?这时候需要用到
# 用到任意个数关键字参数,看例子
def city_temp(*param):
pass
city_temp(bj = '32c',xm = '23c', sh = '32c')
# 上述运行会出错,如图1,原因在于一个 * 不能接受可变的关键字列表!
# 看下正确的运行结果
def city_temp(**param): #用两个星号就可以了 **
print(param)
print(type(param))
pass
city_temp(bj = '32c',xm = '23c', sh = '32c')
# 如图2所示,打印出来的是字典
# 想一想,知道了是字典类型以后,要求在city_temp内部,把每个城市的温度打印出来
# 该如何处理?
# 要打印可变关键字里面列表的所有元素,我们就要遍历这个字典,问题转换为如何迅速的遍历字典?
def city_temp(**param):
for c in param:
print(c)
city_temp(bj = '32c',xm = '23c', sh = '32c')
# 如图3,打印结果只有城市,没有温度,不正确
# 下面看看另外一种错误的打开方式!
def city_temp(**param):
for key,value in param:
print(key,':',value)
city_temp(bj = '32c',xm = '23c', sh = '32c')
# 打印结果如图4,是错误的
# 正确遍历字典的方法如下:
def city_temp(**param):
for key,value in param.items():# 调用param里的内置方法items即可!
print(key,':',value)
city_temp(bj = '32c',xm = '23c', sh = '32c')
#上述结果如图5所示,打印的是正确结果!!
# 面对一个关键字列表 ,如何把一个字典传进来?如图6
def city_temp(**param):
for key,value in param.items():# 调用param里的内置方法items即可!
print(key,':',value)
a = {'bj' : '32c','xm' : '23c', 'sh' : '32c'}
city_temp(**a) #这样即可
# 无论是普通参数列表,还是关键字可变参数列表,目的都是简化函数的调用
# 无论是普通参数列表,还是关键字可变参数列表,他们都有共同的特性:
#来看看上面值都不传入的情况下:图7
def city_temp(**param):
print(param)
for key,value in param.items():# 调用param里的内置方法items即可!
print(key,':',value)
a = {'bj' : '32c','xm' : '23c', 'sh' : '32c'}
city_temp() # 什么值都不传入,打印的是字典,但是for循环进不去
# 混合参数的情况下,怎么处理?
def city_temp(param1,**param): #必须参数,可变参数
print(param1)
print(param)
for key,value in param.items():
print(key,':',value)
a = {'bj' : '32c','xm' : '23c', 'sh' : '32c'}
city_temp(1) # 此时传入必须参数的1
# 如图8 打印结果是 param1 是1 而**param打印结果是空字典
8-9 变量作用域
c = 50
def add(x,y):
c = x + y
print(c)
# 变量作用域
add(1,2)
print(c)
# 看下图一的打印结果,虽然都是c,但是范围是不同的,故结果不一样
# 看看例2
def demo():
c = 10
print(c) #打印结果是错误的,c的使用在函数内部,直接在函数外部打印,超出了c的作用域!
# 看看例3
c = 10
def demo():
print(c)
demo() #打印结果是正确的,因为c在函数外部作用的,在函数内部引用可以打印成正确的结果
c = 10 #全局变量
def demo():
c = 50#局部变量
print(c)
demo()
def demo():
c = 50
print(c)#此时无法引用局部变量
def demo():
c = 50
for i in range(0,9):
c += 1
print(c)#此时打印结果是正确的,引用的就是局部变量
#看看下面的例子
c = 1 # 外部做一个变量。
def func1():
c = 2 # 内部做一个变量
def func2():#在函数内部在定义一个函数
c = 3
print(c)
func2()
func1()
#作用链域是一个最基本的法则
8-11 global关键字
全局变量不仅仅可以在模块里使用,在整个应用程序里都是可以引用的
def demo():
global c #使用global可以访问局部变量(把局部变成全局)
c = 2
demo()
print(c)
#在整个应用程序里均可以使用global,不仅仅是在模块中