版权声明:个人原创,所属@jerry 本人 https://blog.csdn.net/qq_42938842/article/details/82531067
函数基础
### 函数简介
- 定义:具有特定功能的一段代码
- 优点:
- 可以减少代码的重复书写
- 可以将功能的实现着和使用者分开,可以提高开发效率
- 分类:
- 库函数:print、input、type等
- 自定义:用户自己封装的函数
### 函数使用
- 函数定义格式
```python
def 函数名([参数列表]):
函数体
```
> []表示参数是可选的,参数可以有,也可以没有,有也可以是一个或多个。
- 函数名:
- 像变量名一样,只要符合标识符命名规范即可。
- 函数调用:
- 函数定义后不会执行,只有调用后才会执行
- 调用格式:`函数名([参数])`
### 函数分类
- 说明:按照函数的参数与返回值
- 示例:
```python
# 无参无返回值
def print_ten_hello():
for i in range(10):
print('Hello world!')
# 带参无返回值
def print_n_hello(n=10):
for i in range(n):
print('Hello world!')
# 带参有返回值
def add(a, b):
return a + b
```
> return:返回函数的返回值,一旦执行,函数立即结束。
### 函数参数
- 形参:形式参数,就是写在函数定义处的参数。
- 实参:实际参数,就是在函数调用时传递的参数。
- 位置参数:函数定义时没有默认值的参数,也叫必传参数。调用时的实参与定义处的形参一一对应
- 默认参数:函数定义时有默认值的参数,调用时可以不传。默认参数必须放在最后。
- 关键字参数:函数调用时指定参数的名字,参数的位置就无所谓了。
- 可变长度参数:
```python
# 可变长度参数
def var_len_args(a, b, *args, **kwargs):
print(a, b)
# 是一个元组,存放多传的位置参数
print(args)
# 是一个字典,存放多传的关键字参数
print(kwargs)
var_len_args(2, 3, 4, 5, name='二狗', age=10)
```
- *的使用
```python
def show(a, b):
print(a, b)
```
```python
show(2, 3)
lt = [2, 3]
<div class="se-preview-section-delimiter"></div>
#show(lt[0], lt[1])
<div class="se-preview-section-delimiter"></div>
#与上面的方式等价,*相当于将列表中元素展开位置参数的形式
show(*lt)
def show2(aa, bb):
print(aa, bb)
d = {'aa': 123, 'bb': 456}
show2(aa=d['aa'], bb=d['bb'])
与上面的式子等价,相当于将字典中的元素展开成关键字参数的形式
show2(**d)
<div class="se-preview-section-delimiter"></div>
“`
函数进阶
- 函数定义的位置是随意的吗?
- 不是,一定要先定义再调用,也就是调用一定要在定义之后。
- 函数的名字可以相同吗?
- 不可以,若出现同名函数,后者会覆盖前者。
- 函数中能否再定义一个函数?
- 可以,函数内部定义的函数叫内部函数,它是很多高级功能的基础。
变量作用域
块级作用域
if True: a = 10 # 变量没有块级作用域 print(a)
局部作用域
def test(): name = '二狗' # 局部变量:定义在函数内部的变量,拥有局部作用域 # print(name)
全局作用域
# 全局变量:定义在函数外部的变量,拥有全局的作用域 num = 20 def show(): # 全局变量在函数内部只能使用,不能更改 # 局部变量与外部变量同名,局部优先 # 若果想在函数中修改全局变量,需要声明 global num num = 10 print(num) show() print(num)
nonlocal使用
def wai(): n = 100 def nei(): # 声明使用非本地变量:外部函数的局部变量 nonlocal n n = 200 print(n) nei() print(n) wai()
常用函数
内置函数(无需导入)
print:打印、输出 input:输入 type:类型 len:统计元素个数 range:产生连续的整数对象 enumerate:枚举可迭代对象 ord:字符转换为ASCII chr:ASCII转换为字符 id:获取变量地址,不要纠结 abs:求绝对值 类型转换: int、float、complex、set、list、str、dict、tuple max:求最大值(多个参数或一个容器对象) min:求最小值 sum:容器对象元素求和 pow:求幂 round:四舍五入 hex:16进制 oct:八进制 bin:二进制
模块函数(需要导入)
''' import time while True: print('Hello world!') time.sleep(1) ''' ''' 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)) ''' import sys # 存放了终端运行时的所有参数列表 print(sys.argv)
练习
前面的练习能使用函数封装就封装成函数
终端计算器,完成加减乘除功能
import sys def numeration(a,b,c): if b == '+': return int(a) + int(c) elif b == '-': return int(a) - int(c) elif b == '*': return int(a) * int(c) elif b == '/': return int(a) / int(c) print(numeration(sys.argv[1],sys.argv[2],sys.argv[3]))
删除列表中重复的元素
lt = [1, 2, 3, 4, 5, 6, 4, 2, 3, 1, 7] a = list(set(lt)) a1 = sorted(a, key=lt.index) print(a1)
统计一个字符串中字母、数字及其他字符的个数,返回一个元组
#统计一个字符串中字母、数字及其他字符的个数,返回一个元组 def char_count(string): len1 = len(string) count = 0 count1 = 0 count2 = 0 for i in range(len1): x = ord(string[i]) if (65 <= x <= 90) or (97 <= x <= 122) : count += 1 elif 49 <= x <=57 : count1 += 1 else: count2 += 1 return count,count1,count2 str = input('请输入字符串:') print(char_count(str),type(char_count(str)))
返回一个列表中第二大的数
lt = [1,3,5,8,9,7,9,7,1,2,] def second_max(): a = max(lt) lt.remove(a) b = max(lt) return b print(second_max()) lt = [1, 3, 2, 8, 9, 7, 6, 5, 4] lt.sort() print(lt[-2])
完成列表的排序,支持逆序
def list_sort(lt, reverse = False): n = len(lt) for i in range(n-1): for j in range(i+1,n): if reverse : if lt[i] < lt[j]: lt[i] , lt[j] = lt[j], lt[i] else: if lt[i] > lt[j]: lt[i], lt[j] = lt [j],lt[i] lt = [1,3,7,6,9,5,4,7] list_sort(lt,reverse=True) print(lt)
号码归属地查询:
- “`
“`
set = '''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|吉林省长春市|吉林移动大众卡'''
<div class="se-preview-section-delimiter"></div>
#保存信息的字典
guishudi = {}
<div class="se-preview-section-delimiter"></div>
#按照换行进行切割
lt = set.splitlines()
<div class="se-preview-section-delimiter"></div>
#遍历处理
for info in lt :
#按照‘|’进行切割
info_list = info.split('|')
#保存有效信息到字典
guishudi[info_list[1]] = info_list[-1]
while True:
phone = input('请输入号码的前七位:')
if len(phone) < 7:
print('号码尾数不够')
continue
#提取前七位
phone = phone [:7]
info = guishudi.get(phone,'号码有误')
print(info)
<div class="se-preview-section-delimiter"></div>
“`