08Python的函数

第八章 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))

image

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段代码带来的结果

image
image
image

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打印结果是空字典

image
image
image
image
image
image
image
image

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,不仅仅是在模块中

image

你可能感兴趣的:(08Python的函数)