我们要开车时,怎么办?先找一台车,这台车是配置好的,能上路的。我们不太可能去学造车,这需要很大的时间成本,当然对于汽车狂热者这是可以理解的!

为什么讲开车?函数也如此,我们不需要去写函数,函数是由其他人写好的,我们拿来用就好了,跟开车的道理一样。

函数有函数名、参数和返回值。函数很灵活,可以相互嵌套,可以在类中使用,还可以在模块中使用。(类,这个概念后面会重点讲)

语法:

def 函数名(形式参数):

        函数体

        return 返回值

 形式参数:调用函数需要有变量接住传入的参数,它不是实际的数据,我们叫它形参。可以理解为车辆需要“司机”(自动驾驶除外,且目前自动驾驶还是需要司机的,以后可能...),这个“司机”这可以任何会开车的人,不是具体的某位司机。而传入的实际数据,我们叫实际参数,也就是某位具体驾驶车辆的司机。

# coding=utf-8
# 圆面积求解方法

def area(r):    #r是形式参数
    pi=3.1415926
    area=(r**2)*pi
    return area

x =int( input("请输入圆的半径:"))    #x是实际参数
s = area(x)
print("圆的面积为:{}".format(s))
print("圆的面积为:{:.2f}".format(s))    #这里:.2f意思是小数点后保留2位,参照字符串格式化内容

调用函数:函数名(实际参数)

运行结果:

=== RESTART: C:\Users\Python\Python39\3.求圆面积.py ===
请输入圆的半径:4
圆的面积为:50.2654816
圆的面积为:50.27
>>>

把实际参数传入了函数体当中,得到运算结果。有两个参数时,可以给定两个实参,逗号隔开,想象一下求三角形面积,需要底和高两个参数。

另一种调用方法,直接将实参赋值给形参,放到我们需要结果的变量中。据三角形例子:

# coding=utf-8
# 给定底和高三角形面积求解方法

def area(d,h):    #d和h是形式参数
    area=(d*h)/2
    return area

d1 = int( input("请输入三角形的底边:"))    #d1,h1是实际参数
h1 = float(input("请输入三角形的高:"))
s_area = area(d=d1,h=h1)
print("三角形的底{0},高{1},面积为:{2}".format(d1,h1,s_area))
print("三角形的面积为:{:.2f}".format(s_area))

运行结果:

== RESTART: C:/Users/Python/Python39/4.求三角形面积.py ==
请输入三角形的底边:3
请输入三角形的高:4
三角形的底3,高4.0,面积为:6.0
三角形的面积为:6.00

这里注意两点,浮点数运算的变化,结果保留小数位数。这种写法啰嗦,但便于阅读。

(1)参数默认值

在函数定义时,可以给定默认值。

刚才圆面积的例子里,def(area="1"):就代表半径的默认值为1。这里不具体展示。

(2)可变参数

在参数前加*可将参数组装成一个元组。

#coding = utf-8

def sum(*s):
    total = 0
    for i in s:
        total = i+total
    return total

print(sum(0,1,2))
print(sum(10,20,30))

结果:

=== RESTART: C:/Users/Python/Python39/5.求和函数.py ===
3
60

在参数前加**可将参数组装成一个字典。

假如我们要造一个漫威角色

#coding=utf-8
def Marvel_Hero(**info):
    for key,value in info.items():
        print('{0}——{1}'.format(key,value))

Marvel_Hero(name='美队',combat='95',intelligence='90')
Marvel_Hero(H_name='钢铁侠',H_ability='99')

运行结果:

name——美队
combat——95
intelligence——90
H_name——钢铁侠
H_ability——99

多个参数的键和值以字典形式传入函数中。

(3)变量作用域

变量在函数中创建,作用域是整个函数,称为局部变量,变量在模块中创建,作用域是整个模块,称为全局变量。

试想一下,如果在模块中定义变量和函数中定义的变量名字相同,会发生什么?

首先,他两并不是一个变量,但是如果将函数中同名的局部变量,以global命名,会变成全局变量。类似权限提升。

#coding=utf-8

x = 1
def out_s():
    global x #声明x为全局变量
    x = 2
    print('这里x为:{}'.format(x))

out_s( )
print('模块中x为:{}'.format(x))

运行结果:

==== RESTART: C:/Users/Python/Python39/3453.py ====
这里x为:2
模块中x为:2
>>>

你可尝试注释掉global这一行,你会发现结果变为2和1了。

注意变量的作用域在编程中会非常有用。

灵活使用函数还要了解一些内容,例如函数类型,filter函数和lambda函数等。