一、函数的特点
终于学到函数啦。本质相同,略有区别,总结一下:
1.1 形式上的区别
- 没有大括号包裹的代码块,缩紧进行区分
- def 声明 ,等价于function
- 冒号不能省略
1.2 调用的区别
- 传参严格按照函数的声明,否则会报错
- 可以有多个返回值,但是本质还是返回了一个tuple
作业:请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 ax^2+bx+c=0 的两个解。
#!/usr/bin/env python3
#-*- encoding:utf-8 -*-
import math
def test():
a =int(input("请输入第一个数据a: "))
b = int(input("请输入第二个数据b: "))
c = int(input("请输入第三个数据c: "))
tempSq = math.sqrt(b*b-4*a*c)
y1 = (tempSq-b)/(2*a)
y2 = (-b-tempSq)/(2*a)
print((a,b,c),"的平方根是:",(y1,y2))
test() // 因为我是直接运行这个文件,所以在这个文件里直接执行了
二、函数的参数
2.1 默认参数
有点类似与javascript es6的新特性,定义函数时可以声明参数的默认值:
def f(a,b,c=1,d="测试")
这样的优势很明显,让我们可以更加灵活的来调用这个函数
需要注意一点,这个默认参数的初始化要是一个不可变的对象
2.2 参数数量可变
def calc(*numbers): // 声明
calc(1, 2) // 调用
calc() // 调用
这个有点类似与c++里面的指针的感觉,传入函数的只是一个list的地址,应该是调用时,可变参数,会把传入的参数赋给一个tuple,然后再把一个list的地址传入函数。
其中需要注意的是,如果传入本身就是一个list,如果不带*,会默认把list作为一个参数传入进去,带参数,会把list的子元素作为参数传入。
2.3 关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict;
def person(name, age, **kw): // 比可变参数多了一个*,肯定更牛
demo
def f3(a,b,**c): // 声明
... print(c)
f3(1,2,test='3')
{'test': '3'} // 打印
可以看出,他是把除了必填参数之外的数据,均放到了一个dict中了
2.4 命名关键字参数
和上面不同的是,命名关键字参数可以约束,你需要传的值
可以看到,如果少传入一个数据,会导致报错
需要注意的是,如果参数中有可变参数,* 可以省去,否则不可以;
2.5 参数组合使用
参数可以混合使用,但是参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
练习题:
定义一个可以接收一个或多个数并计算乘积的函数
#!/usr/bin/env python3
#encoding=utf-8
def f(*n):
m = 1
for x in n:
m = m*x
print(m)
f(1)
f(1,2)
f(1,2,3)
f(1,2,3,4)