一、函数
函数是一段可以实现某个功能的代码,将来需要使用该功能时,可以通过函数名来进行调用实现功能。
格式:
定义函数
def 函数名(..):
代码段
调用函数
函数名(..)
二、函数的使用场景
· 面向对象编程:让对象做事(调用函数)
· 面向过程编程:可以理解为写代码的过程
·函数的好处:降低代码的冗余度;提高程序编写的灵活性
三、函数参数的用法
1、基本用法
1) 位置传参
· 形式参数:指的是函数定义时的参数
· 实际参数:指的是调用函数时实际传入的值
def fun1(a1,b1):
print(a1,b1)
fun1(11,22)
2)关键字传参
def fun1(a1,b1):
print(a1,b1)
fun1(b1=11,a1=22)
3)混合传参
def fun1(a,b,c):
d = a+b+c
print(d)
fun1(11,22,c=33)
注意:混合传参时,关键字传参必须是最后一个传入
2、定义函数时给默认值
def fun1(a,b,c=100):
d = a+b+c
print(d)
fun1(11,22)
fun1(11,22,33) # 默认值会被覆盖
fun1(11,22,c=1000) # 默认值会被覆盖
3、动态参数
1)*
实际参数被出传入到函数里面的时候,会被一个元组接收
定义格式:
def 函数名(*a1):
# a1 = (xx,xx,xx)
调用格式:
函数名(xx,xx,xx)
例子:求和
def fun1(*a1):
sum = 0
for i in a1:
if type(i) == int:
sum += i
print(f'总和为{sum}')
fun1(11,22,33)
2)**
传键值对
def fun1(**a1):
print(a1)
fun1(name='ni',age=18)
3)* **混合使用
def fun1(*a1,**a2):
print(a1,a2)
fun1(1,2)
fun1(a1=11,a2=33)
fun1()
fun1(1,a1=11)
四、函数的返回值
return和print的区别
return: 作为函数中的语句结构,主要是用作函数执行结束的返回值
print(): 在控制台中输出
def sum(a,b,c):
d = a+b+c
print(d)
sum(1,2,3)
def sum(a,b,c):
d = a+b+c
return d
sum(1,2,3)
注:用return时,调用函数需要打印,否则没有输出值
def sum(a,b,c):
d = a+b+c
return d
s = sum(1,2,3)
print(s)
五、函数的种类
· 无参返回值为None
def fun1():
print(11)
· 有参返回值为None
def fun2(a1):
print(a1)
· 无参返回值不为None
def fun3():
return 11
· 有参返回值不为None
def fun4(a1):
return a1+10
六、函数的调用
· 单独调用
def fun1():
print('hello')
fun1()
· 嵌套调用
def fun1():
print('hello')
def fun2():
fun1()
print('world')
fun2()
· python中的函数也可以嵌套定义
def fun1():
print('hello')
def fun2():
print('world')
fun2()
fun1()
七、作用域
· python的py文件是一个作用域
· python中的函数内部是一个独立的作用域
1、全局变量和局部变量
· 全局变量:将变量定义在函数的外部
· 局部变量:将变量定义在函数的内部
# 全局变量
NAME = 'nihao'
AGE = 18
def fun1():
# 局部变量
a1 = 3
b1 = 4
c1 = 'hello'
print(a1)
print(b1)
print(c1)
fun1()
· 局部作用域可以访问外部作用域的变量
· 函数与函数之间的作用域的变量是不可以互相访问的
· 在实际开发中,如果定义的变量是全局变量的话,请使用大写字母下划线拼接;如果定义的是局
部变量,使用小写字母下划线拼接
2、global关键字
可以修饰局部变量,将局部变量变成全局变量。
被global修饰的局部变量必须要在函数调用后才能访问
# 全局变量
name = 'nihao'
age = 18
def fun1():
# 局部变量
global a1
a1 = 3
b1 = 4
c1 = 'hello'
print(a1)
print(b1)
print(c1)
a1 = 100
fun1()
print(a1)
八、内置函数
1、第一类函数:与数学运算相关
· abs() 求绝对值
a = abs(-10)
print(a)
· pow() 次方
a1 = pow(2,3) # 计算2的3次方
print(a1) # 8
· sum() 求和
list1 = [1, 2, 3, 4, 5]
res1 = sum(list1)
print(res1)
· divmod() 两个数相除得到一个商和一个余数
a1, b1 = divmod(3, 5)
print(a1) # 商
print(b1) # 余数
· round() 四舍五入保留小数
a1 = round(1.2367538,2)
print(a1)
2、第二类函数:与聚合相关
· min() 最小值
a1 = min([21,3,55,62,3,1])
print(a1)
· max() 最大值
a1 = max([21,3,55,62,3,1])
print(a1)
· all 判断一个序列中是否都是True
list1 = [1,2,3,0,5]
res1 = all(list1)
print(res1) # False
· any 只要有一个是True就可以
list1 = [1,2,3,0,5]
res1 = any(list1)
print(res1) # True
3、第三类函数:和进制相关
· 十进制 转 二进制
a1 = bin(100)
print(a1)
· 二进制 转 十进制
a1 = int('0b1100100',2)
print(a1)
· 十进制 转 八进制
a1 = oct(100)
print(a1) # 0o144
· 八进制 转 十进制
res1 = int('0o144',8)
print(res1)
· 十进制 转 十六进制
a1 = hex(100)
print(a1) # 0x64
· 十六进制 转 十进制
res1 = int('0x64',16)
print(res1)
4、第四类函数:与字符相关
· ord() 获取对应的ASCII码值
a1 = ord('A')
print(a1)
1、· chr() 获取ASCII码值对应的字符
a1 = chr(65)
print(a1)
5、第五类函数:与转型相关
· int()
· str()
· bool()
· list()
· tuple()
· dict()
· bytes()
6、第六类函数:与获取属性数据相关
· len()
· print()
· input()
· open()
· range()
· hash 计算一个值的哈希值(计算存储位)
· type() 查看元素类型
· callable 判断一个变量是不是函数,是否可以执行
· enumerate() 获取序列中的索引以及元素值
list1 = [11, 22, 33, 44, 55]
for index, value in enumerate(list1):
print(f'{index}.{value}')
· sorted() 产生排序后的新列表
list1 = [11, 2, 14, 45, 16]
res1 = sorted(list1)
print(res1) # [2, 11, 14, 16, 45]
print(list1) # [11, 2, 14, 45, 16]
八、模块
-
自定义模块 py文件
-
内置模块 time random ...
-
第三方模块 requests lxml ...
1、模块的导入方式
· import xxx 直接导入大的模块
· from xxx import xxx 从大的模块中导入小的功能
· as 对导入的东西重命名
注:将来定义模块名字的时候,千万不要与内置模块或者与第三方模块重名,否则会导致功能用不了
random.py
import random
res = random.randint(1000, 9999)
print(res)
2、常用的内置模块
1)random
import random
# 获取随机的整数
res = random.randint(10, 20) # [10,20]
print(res)
# 获取随机的小数
res2 = round(random.uniform(10, 20), 2)
print(res2)
# 从列表中随机获取一个元素
list1 = [11, 22, 33, 44, 55, 66, 77, 88]
res3 = random.choice(list1)
print(res3)
# 从列表中随机获取n个元素
list1 = [11, 22, 33, 44, 55, 66, 77, 88]
res3 = random.sample(list1,2)
print(res3)
# 随机打乱顺序
list1 = [11, 22, 33, 44, 55, 66, 77, 88]
random.shuffle(list1)
print(list1)
2)hashlib库
主要是用于数据加密 sha256(可逆) md5(不可逆)
import hashlib
info = '17354074069'
# 获取MD5加密对象
md5_objet = hashlib.md5()
# 修改数据加密编码
md5_objet.update(info.encode('UTF-8'))
# 调用方法,开始加密
res1 = md5_objet.hexdigest()
print(res1) # 301f41f4e66dbc95168ec973e6df9747
3)json库
本质其实是一个字符串,有一些特殊格式的字符串
· 序列化:将自己的文本数据,程序中的数据转变成网络中传输的数据
import json
dict1 = {
'name': '你好',
'likes': ['1', '2', '3'],
'pets': (
{'name': '小花', 'age': 3},
{'name': '小黄', 'age': 2}
)
}
data = json.dumps(dict1, ensure_ascii=False)
print(data, type(data))
· 反序列化:将网络中传输的数据,转变成程序中的数据或者文本数据
import json
info = '''
{"name":"nihao","likes":["1","2","3"]}
'''
data = json.loads(info)
print(data['likes'])
print(type(data))
4)time库
· 时间戳
s1 = time.time() # 时间戳 毫秒级别 整数部分秒级别
print(s1, type(s1))
5)datetime
· 日期相关
from datetime import datetime
# xxxx年xx月xx日 xx时xx分xx秒
s1 = datetime.now()
print(s1,type(s1))
# 日期格式化
s2 = s1.strftime("%H:%M:%S %Y/%m/%d")
print(s2)
from datetime import datetime
# 字符串-->datetime类型 strptime()
s1 = "2024-02-22"
s1 = datetime.strptime(s1, '%Y-%m-%d') # 格式要与字符串的格式一致
print(s1, type(s1))
print('-------------------')
# datetime类型--> 字符串
s2 = datetime.now().strftime("%H:%M:%S %Y/%m/%d")
print(s1,type(s2))
print('-------------------')
# datetime-->时间戳
s3 = datetime.now() # datetime类型
s3 = s3.timestamp()
print(s3,type(s3))
print('-------------------')
# 时间戳-->datetime类型
res = datetime.fromtimestamp(s3)
print(res)
res = res.strftime("%Y/%m/%d %H:%M:%S")
print(res)
# 时间戳-->datetime类型-->字符串
s4 = datetime.fromtimestamp(1708605395).strftime("%Y/%m/%d %H:%M:%S")
print(s4)