函数基础
函数简介
定义: 就是具有特定功能的一段代码
优点:
解决代码的重复书写
可以将功能的实现着和使用者分开, 提高开发效率
分类:
库函数: print,input,abs 等
自定义: 用户自己封装的函数
函数使用
定义函数格式
def 函数名 ([参数列表]):
函数体
[] 表示可选, 参数可以有, 也可以没有, 也可以是多个.
函数名:
与变量一样, 只要遵循标识符的命名规范即可.
函数调用:
函数定以后不会执行, 需要调用才会执行
调用格式: 函数名 ([参数])
函数分类 (参数与返回值)
- # 无参无返回值
- def print_hello():
- for i in range(10):
- print('Hello world!')
- # print_hello()
- # 带参数无返回值
- def print_n_hello(n):
- for i in range(n):
- print('Hello world!')
- # print_n_hello(5)
- # 带参有返回值
- def add(m, n):
- c = m + n
- # 使用 return 返回需要返回的值, 不返回默认为 None
- return c
- print(add(3, 5))
分类的标准是按照有无参数, 以及有无返回值.
函数参数
形参: 形式参数, 就是写在函数定义出的参数
实参: 实际参数, 就是在函数调用时传递的参数
位置参数: 也叫必传参数, 没有默认值的参数
默认参数: 定义时有默认值, 调用时可以不传, 必须写在最后
关键字参数: 在函数调用时指定参数名字, 参数的位置就无所谓.
可变长度参数: 函数调用时可以传递比定义处更多的参数, 多出来的参数会保存在 args 和 kwargs 中
- def var_len_args(a, b, name='goudan', *args, **kwargs):
- print(a, b)
- print(name)
- # 是一个元组, 保存多传的位置参数
- print(args)
- # 是一个字典, 保存多传的关键字参数
- print(kwargs)
- var_len_args(1, 2, 3, 4, age=10)
* 的使用:
- def show(a, b):
- print(a, b)
- lt = [1, 2]
- # 需要从列表根据下表获取元素, 然后作为参数传递
- # show(lt[0], lt[1])
- show(*lt)
- def show2(aa=11, bb=22):
- print(aa, bb)
- d = {'aa': 123, 'bb': 456}
- # show2(aa=d['aa'], bb=d['bb'])
- # 上下等价
- show2(**d)
函数进阶
函数的定义位置是随意的?
不是, 一定是先定义后调用, 函数的调用一定要放在定义之后.
函数的名字可以相同吗?
不可以, 若出现同名函数, 后者会覆盖前者.
函数内容能否再定义函数?
可以, 定义在函数内部的函数叫内部函数, 它是很多高级功能实现的基础.
变量的作用域
块级作用域
- if True:
- name = 'ergou'
- # 能够在块的外部使用, 说明没有块级作用域
- print(name)
局部作用域
局部变量: 定义在函数内部的变量叫局部变量, 只能在函数内部使用.
- def test():
- a = 10
- # 不能再函数外部使用, 此处会报错
- print(a)
全局作用域
全局变量: 定义在函数外部的变量叫全局变量, 哪里都可以使用
- num = 10
- def show():
- # 声明使用的时外部的同名变量
- global num
- # 只能使用, 不能修改, 若想修改协议进行全局声明
- num = 20
- print(num)
- show()
- print(num)
函数内部可以使用外部变量, 但是不能修改
若修改需要使用 global 进行全局声明
当函数内部与外部出现同名变量, 默认使用的时内部变量
nonlocal 使用
说明: 内部函数使用外部函数的局部变量, 需要使用 nonlocal 进行声明
- def wai():
- n = 10
- def nei():
- # 声明使用非本地变量, 外部函数的局部变量
- nonlocal n
- n = 20
- print(n)
- nei()
- print(n)
- wai()
递归函数 (了解)
定义: 函数内部调用函数本身的函数叫递归函数.
组成:
函数内部调用自己
终止条件 (停止调用自己的条件)
核心算法 (具体功能)
特点:
代码简洁
可读性差 (不易理解)
瞬间占用内存较大, 没有终止条件立即崩溃
有些领域是禁止使用的 (安全领域: 汽车电子)
只有在不得不使用的时候才使用 (遍历目录)
练习:
求 n 的阶乘
斐波那契数列的第 n 项
前两项都为 1, 从第三项开始, 每一项都等于前两项的和
如: 1,1,2,3,5,8,13,21,...
常用函数
内置函数 (无需导入)
print: 打印, 输出
input: 输入
abs: 求绝对值
type: 获取变量的类型
chr: 将 ASCII 数值转换为字符
ord: 将字符转换为对应的 ASCII
id: 获取变量地址
len: 统计元素个数
range: 产生连续整数的可迭代对象
enumerate: 枚举可迭代对象
强制类型转换:
- int
- float
- str
- list
- tuple
- set
- dict
max: 求多个参数的最大值, 或可迭代对象中的最大元素
min: 最小值
sum: 求和, 可迭代对象元素求和
pow: 求幂, pow(2, 3) 等价于 2 ** 3
round: 四舍五入, 可以指定保留位数
hex:16 进制
oct:8 进制
bin:2 进制
模块函数 (需要导入)
time:
sleep: 休眠指定的秒数, 可以是小数
math:
e: 自然对数
pi: 圆周率
ceil: 向上取整
floor: 向下取整
sqrt: 开方 (请平方根)
degrees: 弧度转换为度
radians: 度转换为弧度
sys:
argv: 运行程序时所有的命令行参数列表, 第一个是程序文件名
练习: 完成一个计算器, 支持加, 减, 乘, 除运算
练习:
前面练习全部以函数形式进行封装
终端计算器
删除列表中的重复元素
统计一个字符串中字母, 数字及其他字符的个数, 返回一个元组即可
返回一个列表中第二大的数
完整列表的排序函数 (sort), 支持逆序
号码归属地查询:
- '''5582|1860101|010 | 北京市 | 北京联通 GSM 卡
- 5583|1860100|010 | 北京市 | 北京联通 GSM 卡
- 5584|1368141|010 | 北京市 | 北京移动神州行卡
- 5585|1860111|010 | 北京市 | 北京联通 GSM 卡
- 5586|1358198|010 | 北京市 | 北京移动动感地带卡
- 5587|1361139|010 | 北京市 | 北京移动预付费卡
- 5588|1361138|010 | 北京市 | 北京移动神州行卡
- 5591|1360110|010 | 北京市 | 北京移动全球通卡
- 5748|1364110|010 | 北京市 | 北京移动神州行卡
- 10186|1581584|020 | 广东省广州市 | 广东移动全球通卡
- 15046|1391897|021 | 上海市 | 上海移动全球通卡
- 17250|1502207|022 | 天津市 | 天津移动全球通卡
- 21137|1345272|023 | 重庆市万州 | 重庆移动大众卡
- 22700|1347812|024 | 辽宁省沈阳市 | 辽宁移动大众卡
- 24256|1377065|025 | 江苏省南京市 | 江苏移动全球通卡
- 26360|1898606|027 | 湖北省武汉市 | 湖北电信 CDMA 卡
- 28709|1860802|028 | 四川省成都市 | 四川联通 GSM 卡
- 30641|1552961|029 | 陕西省西安市 | 陕西联通 GSM 卡
- 31700|1563007|0310 | 河北省邯郸市 | 河北联通 GSM 卡
- 33360|1583396|0311 | 河北省石家庄市 | 河北移动全球通卡
- 34825|1508122|0312 | 河北省保定市 | 河北移动全球通卡
- 35363|1551235|0313 | 河北省张家口 | 河北联通 GSM 卡
- 37700|1331326|0316 | 河北省廊坊市 | 河北电信 CDMA 卡
- 43500|1350358|0358 | 山西省吕梁市 | 山西移动全球通卡
- 43908|1553625|0359 | 山西省运城市 | 山西联通 GSM 卡
- 44521|1335360|0370 | 河南省商丘市 | 河南电信 CDMA 卡
- 50078|1509369|0378 | 河南省开封市 | 河南移动全球通卡
- 53603|1583981|0398 | 河南省三门峡 | 河南移动全球通卡
- 53916|1335897|0410 | 辽宁省铁岭市 | 辽宁电信 CDMA 卡
- 55248|1554254|0411 | 辽宁省大连市 | 辽宁联通 GSM 卡
- 58618|1374272|0427 | 辽宁省盘锦市 | 辽宁移动全球通卡
- 58932|1554183|0429 | 辽宁省葫芦岛 | 辽宁联通 GSM 卡
- 60268|1340475|0431 | 吉林省长春市 | 吉林移动大众卡'''
来源: https://www.cnblogs.com/chengxubo/p/9937607.html