python基础 函数基础 模块
总复习:
1.计算机核心组件:
- CPU
- 内存
- 硬盘
- 输入设备: 键盘、鼠标
- 输出设备: 显示器、音响..
2.python解释器:
- 将人类编写好的代码转成机器能看得懂的字符。
- 解释器的作用:
帮你执行python代码。
3.pycharm编辑器:
- 编辑器的作用:
可以更好的编写python代码,编辑器内部有很多强大的功能。
能够快速编写代码。
4.编程语言分类:
- 机器语言(机器能直接看懂):
比如: 01010101
- 汇编语言(让人能看懂一点点):
比如: a ---> 01101001
- 高级语言(让人类能直接看懂):
比如: print('hello')
高级语言是更接近于人类的语言。
- 解释型:
一遍解释(翻译)一遍执行, 类似于同声传译。
优点:
开发效率高
可跨平台,一份代码可以多个平台使用。
缺点:
执行效率相比于编译型低。
- 编译型:
先一次性编译然后再执行,类似于 "有道翻译"。
优点:
执行效率高。
稳定义
缺点:
开发效率相比于解释型语言要低。
不可跨平台。
- 解释型语言的种类:
python: 10级别
java: 8
php: 3
- 编译型语言的种类:
C
5.变量:
变量指的是可变化的量。
- 变量名: 可以与变量值绑定关系,通过变量名可以访问变量值。
- 相当于身份证ID号
- 赋值符号(=): 是用来将变量名与变量值绑定关系。
- 变量值: 变量值 指的是 “数据”, 存放在内存中。
6.垃圾回收机制: 注意: GC就是用来做垃圾回收机制的东西。
- 变量名 = 变量值 # 添加一个引用计数
当变量值的引用计数为0时,垃圾回收机制会“不定时”释放资源。
7.查看变量三大特征
- id
- type
- value
8.变量名的命名规范
- 驼峰命名法: 在写类名的时候使用
首字母大写命名
比如: JasonSb
- 下划线命名法: 推荐使用
比如: jason_sb
9.python中八大数据类型
- int:
number = 100 # number = int(100)
- 不可变类型
- float
salary = 1.0 # salary = float(1.0)
- 不可变类型
- str
str1 = 'tank' # str1 = str('tank')
- 不可变类型
# 按照索引取值
str1[1] # 取第二个值
str1[1:10:2] # 顾头不顾尾
# 内置方法
str1.split() # 切分
str1.strip() # 去左右两边的空格
str1.strip('i') # 去左右两边的i
# tank10
str1.join(['tank', '10']) # 字符串的拼接,必须是字符串类型
# 判断字符串开头,若正则返回True,否则返回False
str.startswith()
# 判断字符串结尾,若正则返回True,否则返回False
str.endswith()
# 判断字符串是否是数字,若正则返回True,否则返回False
str.isdigit()
# 新旧替换
str.replace('旧的', '新的')
# 获取某个字符的数量
str.count('字符')
# 查找字符的位置 索引 可能是面试题
str.find('字符') # 找不到返回-1
str.index('字符') # 找不到报错
- list
在[]内,可以存放多个值,每个值以逗号隔开。
list([v1, v2..])
- 可变类型
- 常用内置方法:
list.append() # 追加
list.insert() # 插入值到指定的索引中
list.pop() # 取出某个值,默认取出最后一个
list.remove() # 真正的删除元素
list.extend() # 列表合并
list.sort(reverse=True) # 默认升序 , reverse=True降序
list.copy() # 浅拷贝
- tuple
tuple((v1, v2...))
- 不可变类型
- dict
特点: key是唯一的。
dict({key:value, ...})
- 可变类型
dict[key] # 没有key会报错
dict.get(key, '自定义默认值') # 没有key会报错,默认返回None
dict.items() # 返回一个可迭代对象
dict.keys()
dict.values()
dict.fromkeys('k1', []) # 生成字典 ---》 {'k1': []}
- set
特点: 内置去重功能。
set({v1, v2...})
- 默认可变类型
# 内置方法
set.add()
set.remove()
- bool:
True or False
- 不可变类型
什么是可变?
值变了,id不变称之为可变类型。
什么是不可变?
值变了,id也变 称之为不可变类型。
10.字符编码
结论: 以什么编码,就以什么解码。
utf-8:
- 存中文是3个字节。
- 存英文是1个字节
gbk:
- 存中文是2个字节。
- 存英文是2个字节
11.文件处理:
f = open('文件名的路径', '打开的模式', encoding='字符编码')
f.close()
# 文件的上下文管理: with , flask框架的上下文管理(后期学习)
with open('文件名的路径', '打开的模式', encoding='字符编码') as f:
# 内部帮你执行f.close()
- 打开模式:
- 文本模式:
- rt
- wt
- a
- 二进制模式:
- rb
- wb
- ab
- 光标移动:
f.seek('光标移动的位置', 0) # 开头
f.seek('光标移动的位置', 1) # 当前
f.seek('光标移动的位置', 2) # 末尾
- 打开文件取值的优化方式:
- f.read():
直接将文件中所有数据一次性取出。
缺点:
内存容易溢出。
- for循环f句柄操作:
# 通过for循环,将每一行取出,保证不会内存溢出
for line in f:
print(line)
- f.readline(): (了解)
读取一行,光标移动到第二行。
12.函数基础
函数是一些列功能的结合体,是一个可以重复使用的工具。
- 函数定义:
def 函数名(参数1, 参数2...):
'''注释: 说明函数的作用'''
# 逻辑代码
return 返回值
- 函数调用
函数() # 若有参数则要传参
- 定义有参、无参、空函数
def func1(参数):
逻辑代码
pass
def func2():
# 逻辑代码
pass
def func3():
pass
- 函数的参数:
- 定义阶段: (参数用来接收调用者传入的)
- 位置形参参数
- 默认参数
- 可变长参数
- 调用阶段: (根据函数的定义者传的)
- 位置实参参数
- 关键字参数
- 注意:
# 参数从左到右的顺序
位置 ---》 关键字参数 ---》 可变长参数
- 函数的返回值:
- 返回值可以是一个或者多个
return 值1 ---> 值1
return 值1, 值2 ---> (值1, 值2)
13.名称空间与作用域:
- 名称空间:
在内存中产生,是一个存放名字的地方。
- 内置名称空空间: python解释器
- 全局名称空空间: 文件中所有(顶着最左边写的)
注意: 无论嵌套if, while, for 多少层都是一个。
- 局部名称空空间: 在函数内部定义的。
- 查找顺序:
当前局部 ---》 外层局部 ---》 全局 ---》 内置
- 加载顺序:
内置 ---》 全局 ---》 外层局部 ---》 当前局部
- 作用域:
- 全局作用域:
- 内置
- 全局
- 局部作用域
- 外层局部
- 内层局部
- global: 在局部可以声明全局名字。
相当于将全局变量引用到局部中使用或修改。
- nonlocal: 在内层局部声明外层局部的名字。
14.函数对象、函数嵌套与闭包
- 函数对象: 函数的名字 ---》 函数的内存地址
- 函数嵌套:
def outer():
def inner():
pass
- 闭包:
为了装饰器作准备,它不是一个独立的技术。
闭包是函数嵌套、函数对象、名称空间与作用域的结合体。
- 内层函数封闭:
外部不能调用内部的函数。
- 外层函数开放:
外部能调用外层函数
- 闭包:
- 内层函数想要引用外层函数的名字
- 外部想要调用内部的函数,要在外层函数将内层函数的名字返回。
def outer(x): # 10
# x = 10
def inner():
print(x) # 10
return inner
inner = outer(10)
inner() # 实现了外部调用内层函数
15.装饰器:
装饰的工具。
作用:
- 1:在不修改被装饰对象的源代码
- 2:在不修改被装饰对象的调用方式
- 基于1和2,为被装饰对象添加新功能。
# 无参装饰器:
def wrapper(func):
def inner(*args, **kwargs):
# 调用被装饰对象前添加新功能
res = func(*args, **kwargs) # index()
# 调用被装饰对象后添加新功能
return res
return inner
# 被装饰对象:
def index(参数1):
print('from index..')
index = wrapper(index)
index(实参1) # inner(实参1)
# 有参装饰器: ---> 本质上就是无参装饰器
def login_auth(name):
# 无参装饰
def wrapper(func):
def inner(*args, **kwargs):
# 对name做一个权限认证
if name == 'tank':
# 调用被装饰对象前添加新功能
res = func(*args, **kwargs) # index()
# 调用被装饰对象后添加新功能
return res
else:
print('你不是tank,get out!')
return inner
return wrapper
@ login_auth('tank') # wrapper
@wrapper
def index():
pass
- 叠加装饰器:
- 装饰顺序:
从下往上
- 执行顺序:
从上往下
16.迭代器:
迭代的工具。
- 可迭代对象:
凡是内置有__iter__(),都是可迭代对象。
- 迭代器对象:
凡是内置有__iter__()与__next__(),都是迭代器对象。
优点:
- 可以不依赖索引取值
- 节省内存
缺点:
- 取值麻烦
- 无法获取长度
- for line in 可迭代对象: ----》 in: 将“可迭代对象”转成“迭代器对象”
- 内置有捕获异常机制:
while True:
try:
迭代器.__next__()
except StopIteration:
break
17.生成器:
生成器是一个自定义的迭代器, 生成器本质上就是一个迭代器。
- 如何生成:
- yield
def func():
yield 1
yield 2
yield 3
g = func()
g.__next__()
next(g)
# ---> 生成了生成器对象,然后每执行一次__next__,
# 会取出一个值,到下一个yield会暂停。
18.三元表达式:
res = 条件成立的值 if 条件 else 条件不成立的值
19.列表生成式:
[line for line in 可迭代对象] # ---》 list ---》[line1, line2...]
[[1, 2, 3, line] for line in 可迭代对象] # [line1, line2...]
优点:
- 可以依赖索引取值,取值方便
- 可以获取长度
缺点:
- 占用内存空间
20.生成器表达式(生成式):
(line for line in 可迭代对象) # ---> 生成器
优点:
- 不占用内存空间
缺点:
- 不可以依赖索引取值,取值不方便
- 不可以获取长度
21.匿名函数与内置函数
- lambda 参数: 返回值
注意: 匿名函数必须配合内置函数使用,否则毫无意义
- 内置函数:
max(key=匿名函数) # 最大值
min(key=匿名函数) # 最小值
sorted(key=匿名函数) # 排序,默认升序,reverse=True降序
map(匿名函数) # 映射
reduce(匿名函数, ) # 合并
from functools import reduce
reduce()
filter(匿名函数,) # 过滤
22.递归:
- 递推:
先递推,重复往下执行函数本身,每一次执行都会更接近于终止条件。
- 回溯:
当递推遇到一个终止条件,开始回溯,一层一层往上推导。
23.面向过程编程:
是一门编程思想:
核心是 “过程” 二字,过程指的是解决问题的步骤,即先干什么再干什么
基于该编程思想编写程序,就好比一条工厂流水线,一种机械式的思维方式。
24.模块:
模块本质上就是一个.py后缀的文件。
模块是一系列功能(变量,函数)的结合体。
- 更好管理python代码
- 三种来源:
- 内置
- 第三方
- 自定义的
- 四种表现形式:
# 关注的:
- 包下带有__init__.py的文件夹中的一组py文件。
- python解释器自带的。
- 模块的导入方式:
- import 模块名字
- from 模块 import 函数/变量名
- 导入模块时发生的事情:
1.先执行当前执行文件,生成一个当前文件的名称空间。
2.会执行被导入的模块,会生成一个被导入模块的名称空间。
3.将被导入模块的名称空间加载到内存中。
- 首次导入模块发生的事情:
import demo
import demo
import demo
在执行文件中导入多次相同的模块,
会只加载首次导入的模块的名称空间。
25.包:
注意: 包也可以称之为模块。
包是内部带有__init__.py的文件夹。
包是一系列模块的结合体,用来管理模块。
- 导入包时发生的事情:
1.会先执行包下面的__init__.py,产生一个名称空间。
2.会将包中的所有模块都加载__init__.py的名称空间中。
3.当在执行文件中使用包中的模块,指向的是__init__.py的名称空间。
- 由__init__.py来帮我们管理模块。
- 导入包的方式:
import 包.模块名
from 包 import 模块名
from 包.模块 import 模块中名字 (变量名/函数名)
26.常用内置模块:
- time (******) --> time.time() , time.sleep()
- datetime (******)
- --> 格式化时间 ---> Format String
- 时间的计算:
日期时间 = 日期时间 + or - 时间对象(时间间隔对象)
时间对象 = 日期时间 + or - 日期时间
- random:
random.random() ---> 随机获取 0——1 的浮点数
random.uniform(1, 10) ---> 随机获取 1——0 的浮点数
random.randint(1, 10) ---> 随机获取 1——0的整数
random.choice(根据索引取值的可迭代对象) ---> 随机获取可迭代对象某一个值
random.shuffle(根据索引取值的可迭代对象) ---> 随机打乱
- os
# 获取当前执行文件中的目录(文件夹)
os.path.dirname(__file__)
# 路径拼接
os.path.join('文件的路径', '文件名')
# 判断文件或文件夹是否存在
os.path.exists('文件绝对路径')
# 判断文件夹是否存在
os.path.isdir('文件夹绝对路径')
# 判断文件是否存在
os.path.isfile('文件绝对路径')
# 创建文件夹
os.mkdir()
# 删除文件夹
os.rmdir() # 注意: 只能删除空的文件夹
# 打印文件夹中所有的文件名
os.listdir('文件夹的路径')
- sys
sys.path # 环境变量中的路径
sys.path.append(
'项目目录'
)
sys.argv # 获取cmd中的命令行 [py文件路径, 'tank', '123']
# 可以做执行用户的校验,限制某个用户可以执行当前py文件
python3 py文件路径 tank 123
- hashlib
加密:
MD5:
md5_obj = hashlib.md5()
# 密码加密
md5_obj.update(密码.encode('utf-8'))
# 加盐
md5_obj.update(盐.encode('utf-8'))
md5_obj.hexdigest()
- 序列化与反序列化:
序列化: 将其他数据类型 ---》 json数据格式 ---》 字符串 ---》 写入文件中
反序列化: 读取文件 ----》 字符串 ---》 json数据格式 ---- 》 其他数据类型
- json
优点:
- 可以跨平台
缺点:
- 不支持python的set
注意: 传入的元组变成列表
json.dumps()
- res = 将其他数据类型 ---》 json格式的字符串
- f.write(res)
json.loads()
- json_res = f.read()
- python_data = json.loads(json_res)
json.dump()
内部执行了f.write()
json.load()
内部执行了f.read()
- pickle
优点:
- 支持python的任意数据类型
- 可以存入二进制的数据
- 存取速度快
缺点: (致命的)
- 不能跨平台使用
- 只能python自己使用
- collections
- 具名元组:
from collections import namedtuple
namedtuple('对象的名字', 'x y')
obj = namedtuple('坐标', ['x', 'y'])
target_obj = obj(10, 20)
target_obj.x # 10
target_obj.y # 20
- 有序字典:
from collections import OrderedDict
order_dict = OrderedDict({key: value})
- re:
- 正则表达式
正则表达式是一个独立的技术, 由一堆特殊的字符组成。
- 字符组
- 元字符
- 组合使用
- re模块
在python中要想使用正则表达式,必须通过re模块来编写。
- subprocess
可以通过python代码往操作系统终端输入命令,并返回结果。
- 可以远程操控电脑
- logging:
注意1: log文件的目录
注意2: log文件名
注意3: log配置字典
注意4:
logging配置字典:
LOGGING_DICT = {}
import logging.config
logging.config.dictConfig(LOGGING_DICT)
logger = logging.getLogger('普通用户')
logger.info('日志打印消息...')
27.第三方模块:
- requests
- requests.get(url) ---> response
- response.text # 获取文本数据
- response.content # 获取二进制数据
- openpyxl:
# 创建文件
from openpyxl import Workbook
wb_obj = Workbook()
wb1 = wb_obj.create_sheet('工作表名字1', 0)
wb2 = wb_obj.create_sheet('工作表名字2', 1)
wb1['C30'] = 200
wb_obj.save('文件名字.xlsx')
# 读取文件
from openpyxl import load_workbook
wb_obj = load_workbook('文件名字.xlsx的路径')
wb1 = wb_obj['工作表名字1']
print(wb1['C30'].value) # 200
28.防止模块被导入时自动执行测试代码
if __name__ == '__main__':
执行测试代码
29.软件开发目录规范:
- 项目目录:
- conf:
- settings.py
- core:
- src.py # src ---> source
- db:
- data.json
- data.pickle
- interface:
- user_interface.py
...
- lib:
- common.py
- log:
- user_log.log
...
- bin/ start.py:
- start.py
- readme.txt
项目说明书
30.enumerate
可迭代对象: list, tuple, dict
# [1, 2, 3]
enumerate(可迭代对象) ---》 g((0, 1), (1, 2), (2, 3))