学会函数,从此告别3000行重复代码
众所周知,python是世界上入门最简单的语言!?——周某人
前言
假设面试官给你出个题目:计算出三组,每组两个数字的完全平方和,再进行相加(面试官:我才不会出这么简单的题目,哼?)你是老老实实的将同一段代码敲三遍还是用一种更加巧妙的方法在面试官面前秀他一脸呢?(当然是秀他一脸了?),所以为了能在面试的时候秀面试官一脸,我们必须学会一种很酷炫的写法——函数!
初识函数
- 函数定义:具有特定功能的一段代码。
- 优点:可以减少代码的重复书写,可以将功能的实现者和使用者分开,提高开发效率。
- 分类:
- 库函数:print、input、type等
- 自定义函数:用户自己封装的函数
函数使用:
-
基本格式:
def 函数名([参数列表]): 函数体
-
函数名:就像变量名一样,只要符合标识符命名规范即可。
-
函数调用格式:函数名([参数])
-
说明:函数不调用是不执行的,只有调用后才会执行。
函数分类
-
按照有无参数以及返回值对函数进行分类
-
无参数无返回值:
# 无参无返回值 def print_ten_hello(): for i in range(10): print('hello world!') # 无参:调用时无需传参数 # 无返回值:执行完函数的返回值为None # None的一个作用是为了不报错,仅仅只是这样 ret=print_ten_hello() print(print_ten_hello())
-
有参数无返回值:
# 带参无返回值 def print_n_hello(n): for i in range(n): print('hello world!') # 需要传递参数 print_n_hello(3)
-
有参数有返回值:
# 带参有返回值 def add(a, b): ret = a+b # 使用关键字return返回内容 # 一旦执行return,函数立即结束 # return后面会返回函数返回值 return ret print(add(3,5))
函数参数
-
形参:形式参数,就是写在函数定义处的参数。
-
实参:实际参数,就是在函数调用时传递的参数。
-
位置参数:函数定义时没有默认值的参数,也叫必传参数。调用时实参与定义时的形参要一一对应
-
默认参数:函数定义时有默认值的参数,调用函数时可以不传递该参数。默认参数需要放在末尾
-
关键字参数:函数调用时指定参数的名字,参数的位置就无需考虑。
-
可变长度参数:
def var_len_args(a, b, *args, name='二狗', **kwargs): print(a, b) # 是一个元组,用于保存多传的位置参数 print(args) # 是一个字典,用于保存多传的关键字参数
-
'*'的使用:
def show(a, b=8): print(a, b) lt = [2, 3] # show(lt[0], lt[1]) # 与上式等价,*是将列表展开,然后作为位置参数传递给函数 show(*lt) d = {'a': '大花', 'b': 18} # show(a=d['a'], b=d['b']) # 与上式等价,**式将字典展开,然后作为关键字参数传递给函数 show(**d)
函数解惑
- 函数定义的位置是随意的吗?
- 不是,函数调用一定要放在定义之后,也就是先定义再调用。
- 函数的名字是否可以相同?
- 不可以,虽然语法不报错,但是后者会覆盖前面的同名函数。
- 函数内部能否定义另一个函数?
- 能,函数内部定义的函数叫内部函数,它是很多高级功能实现的基础。
常用函数(系统函数)
print:打印,输出
input:输入
type:获取类型
len:统计元素个数
range:产生连续的整数对象
enumerate:枚举可迭代对象
ord:字符转ASCII
chr:ASCII转字符
abs:求绝对值
类型转换:int、float、str、bool、set、list、tuple、dict
max:最大值
min:最小值
sum:求和
pow:求幂
round:四舍五入
hex:十六进制
oct:八进制
bin:二进制
模块函数(需要导入)
1.时间函数
import time
while True:
print('Hello world!')
time.sleep(1)
2.数学函数
import math
print(math.e)
print(math.pi)
print(math.ceil(3.1))
print(math.floor(3.9))
print(math.sqrt(4))
# 度转换为弧度
print(math.radians(360))
# 弧度转换为度
print(math.degrees(math.pi))
3.sys函数
import sys
# 是一个列表,保存所有的命令行参数
print(sys.argv)
变量作用域
-
块级作用域
if True: name = 'xiaoming' # 没有块级作用域 print(name)
-
局部作用域
def test(): a = 10 test() # 局部变量:在函数内部定义的变量,只能在函数内部使用 # print(a)
-
全局作用域
# 全局变量:定义在函数外部的变量,拥有全局的作用 num = 10 def show(): # 函数内部可以使用外部定义的变量 # print(num) # 若想更改外部变量,需要进行global声明 global num # 不能更改外部的全局变量,而是定义了一个局部变量 num = 20 show() print(num)
-
nonlocal使用
def wai(): n = 100 def nei(): # 使用外部函数的局部变量,需要进行声明才可更改 nonlocal n # 内部函数可以使用外部函数的局部变量,但是不能更改 n = 200 print(n) nei() print(n) wai()
匿名函数
在讲述匿名函数之前先了解函数拥有的两个属性
-
函数可以像普通变量一样进行赋值
def test(): print('for test') print(test.__name__) # 函数可以像普通变量一样进行赋值 a = test print(a.__name__) a()
-
函数可以作为一个函数的参数
def show(func): func() # 函数作为参数传递 show(test)
-
匿名函数:
- 说明:当将函数作为参数传递时,若函数只需要一次,没有必要单独定义函数,可以使用匿名函数解决。
- 格式:
lambda 参数列表: 表达式
- 参数列表与定义函数一样,可以是多个,多个参数之间使用逗号分隔
- 表达式就是返回值,不需要使用return关键字
- 示例:
lt = [ {'name': 'dahua', 'age': 18, 'height': 165}, {'name': 'erhua', 'age': 16, 'height': 160}, {'name': 'dagou', 'age': 20, 'height': 175}, {'name': 'ergou', 'age': 15, 'height': 155} ] def key(d): return d['height'] # lt.sort(key=key) lt.sort(key=lambda d: d['age']) for i in lt: print(i)
下期预告:下一期将要讲解闭包的使用、装饰器及其类型以及简单递归函数的coding 规则。
Tips:如有疑问欢迎随时打扰 ???