一. 初识python.
1. 认识计算机
CPU(大脑) 3GHZ + 内存(DDR4) + 主板 + 电源(心脏)+ 显示器 + 键盘 +鼠标+ 显卡 + 硬盘 80MB/s
操作系统
windows 家用
linux 服务器
macOS 家用+服务器
计算机是一个高度集成的电子电路
高低电平. 二进制
二进制没有2 -> 0 1
八进制没有8 -> 0-7
十进制没有10 -> 0-9
十六进制没有16 -> 0-9 A-F
显卡
1. NAVID 看型号。
2. AMD 图形处理
2. python历史
python是一门弱类型解释型高级编程语言
编译型, 把写好的程序编译成计算机认识的二进制
优点:一次编译到处运行。 运行效率高, 开发效率低 0.001s
解释型,
缺点:运行慢 0.01s
优点:开发效率高. 简单
3. python的版本
2.x 老版本已经不再更新,2020年已将淘汰
3.x 学习用这个
4. 安装
网址:python.org
选择:3.6.5 mac选择macOS 64-bit installer
安装:
5. 编辑器的选择
1. 所有的文本编辑器都可以编写代码。记事本,Editplus,sublime, pycharm(收费)
2. 可以在命令行写代码.
6. 第一个python程序
python程序有两种编写方式:
1. 进入cmd控制台. 输入python进入编辑模式. 这时候我们可以直接编写python程序
2. 也可以在.py文件中编写python代码. 通过python命令来执行python代码
7. 变量
概念: 把程序运行过程中产生的中间值保存在内存. 方便后面使用.
命名规范:
1. 数字, 字母, 下划线组成
2. 不能数字开头, 更不能是纯数字
3. 不能用关键字
4. 不要用中文
5. 要有意义
6. 不要太长
7. 区分大小写
8. 驼峰或者下划线命名
数据类型:
1. int 整数 +-*/ % // **
2. str 字符串 ', ", ''', """ 括起来的内容 +拼接 (用"+"连接的两端必须是字符串),*重复("*"后面必须跟的是数字),
3. bool 布尔 True, False
4.换行:"\n"表示转移字符,换行. 三个单引号或者三个双引号中的字符串内回车即可换行
5.类型转换
int(str) # 字符串转换成整数
str(int) # 整数转换成字符串
8. 常量
本质就是变量. 所有字母都大写
9. 用户交互
变量 = input(提示语)
所有的输入的内容都是字符串
int(变量) 把变量转化成数字
10. if条件判断
1.
if 条件:
if语句块
执行流程:判断条件是否为真. 如果真. 执行if语句块
2.
if 条件:
if语句块
else:
else语句块
执行流程:判断条件是否为真. 如果真. 执行if语句块 否则执行else语句块
3.
if 条件1:
if-1
elif 条件2:
if-2
elif 条件3:
if-3
....
else:
else语句块
执行流程:
判断条件1是否成立, 如果成立执行if-1
否则如果条件2成立, 执行if-2
否则如果条件3成立, 执行if-3
....
否则执行else语句块
4. 嵌套
if 条件:
if 条件:
..
else:
if 条件:
...
11. while循环
while 条件:
循环体(break, continue)
能够让循环退出: 1. break 2. 改变条件 continue 停止当前本次循环,继续执行下一循环
break 彻底的干掉一个循环
二.运算符和编码
1. 格式化输出
%s就是代表字符串的占位符,可以代替所有
%d,是数字占位符,只能代替数字
name = input("请输入你的名字:")
address = input("你来自哪里:")
hobby = input("你喜欢什么:")
#比较繁琐的方式
print("我叫"+name+",我来自"+address+",我喜欢"+hobby)
#通用的方式
print("我叫%s,我来自%s,我喜欢%s" % (name,address,hobby))
# python的新版本的方式,简单
print(f"我叫{name},我来自{address},我喜欢{hobby}")
print("我叫%s,我已经度过了人生的30%%" % "好人") #如果占位时字符串中有%,需要用%%来表示
2. 运算符 and or not (难点)
1.算数运算符
2. 比较运算符
3.赋值运算符
4.逻辑运算符
运算顺序: ()=> not => and =>or
当出现 X or Y 时,判断X是否为0,如果X是0,则输出Y,否则返回X
当出现 X and Y 时,判断X是否为0,如果X是0,则输出X,否则输出Y
True相当于非0 , False相当于0
补充:in和not in
可以判断xxx字符串是否出现在xxxxx字符串中
content = input("请输入你的评论")
if "苍老师" in content or '邱老师' in content:
print('你输入的内容不合法')
else:
print("评论成功")
3. 初识编码 gbk unicode utf-8
1. ascii 8bit 1byte(字节) 256个码位 只用到了7bit, 用到了前128个 最前面的一位是0
2. 中国人自己对计算机编码进行统计. 自己设计. 对ascii进行扩展 ANSI 16bit -> 清华同方 -> gbk
GBK 放的是中文编码. 16bit 2byte 兼容ascii
3. 对所有编码进行统一. unicode. 万国码. 32bit. 4byte. 够用了但是很浪费
4. utf-8 可变长度的unicode
英文: 1byte
欧洲文字: 2byte
中文: 3byte
字节(byte)
1byte = 8bit
1kb = 1024byte
1mb = 1024kb
1gb = 1024mb
1tb = 1024gb
1pb = 1024tb
三.字符, 列表和元组
1. 基本数据类型概况
1, int 整数
2. str 字符串
3. bool 布尔值
4. list 列表. 一般存放大量的数据 ["门神xxxx", "风扇哥xxxx", 元素]
5. tuple 元组. 只读列表, 只能看啥也不能干. (元素, 元素)
6. dict 字典. {"风扇哥":"王伟哲", "wlh": "王力宏"}
7. set 集合 {"风扇哥", "wlh"}. 不重复
8. bytes 一堆字节. 最小数据单元
2. int类型的相关操作.
数字没办法执行其他操作. 操作只有+-*/, //, %, **
8bit => 1byte
bit_length() 二进制长度
3. bool类型的操作. 基本类型转换的问题
bool类型没有操作.
类型转换
结论一: 想把xxx转化成yy类型. yy(xxx)
结论二: 能够表示False的数据: 0, "", [], {}, set(), tuple(), None, False
4. str 认识字符串(重点, 多)
字符: 单一的文字符号
字符按照固定的顺序连成串
被' 或者" 或者''' 或者"""括起来的内容
索引 编号, 顺序
从0开始
切片
s[start:end:step]
start:开始
end: 结束 取不到
step: 步长, 控制方向. 每xx个取一个
一大波操作.
字符串是不可变的数据类型. 不论如何操作.对原来的字符串是不会有影响的
1, upper() 转换成大写. 忽略大小写
2, strip() 去掉左右两端的空白 空格, \t \n. 所有用户输入的内容都要去空白
3, replace(old, new) 把old替换成new
4, split() 字符串切割
5, startswith() 判断是否以xxx开头
6, find() 查找, 找不到返回-1
7, isdigit() 判断是否是数字组成
8, len() 求长度
for循环遍历字符串
for 变量 in 可迭代对象:
循环体
for c in s: # c: charactor(字符) s: string
print(c)
5. 什么是列表
定义: 能装对象的对象
在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求
列表存在索引和切片. 和字符串是一样的.
6. 相关的增删改查操作(重点)
添加:
1. append() 追加
2. insert(位置, 元素) 插入指定元素到指定位置
删除:
1. pop(index) 根据索引删除
2. remove(元素) 根据元素删除
修改:
索引修改
lst[索引] = 元素
查询:
for循环.
7. 列表的嵌套
多个列表互相嵌套
8. 列表的其他操作
1. count() 计数
2. sort() 排序,升序 ; sort(reverse = True)降序
3. reverse() 翻转
4. len() 求长度
9. 什么是元组
能装对象的对象. 不可变. 一旦确认好. 不可更改
只读列表
可以迭代
10. 元组的嵌套
和列表一样.都可以互相嵌套.
元组的不可变: 指向不变
元组不可改,列表可以改
tu = ruple() 空元组,固定写法
当元组中只有一个元素时 tu = (1,) 要加","
tu = (1) # 不是元组,<class,'int'>
tu = (1,) # 是元组,<class,'tuple'>
元组也是可迭代的,可以使用for循环
关于不可变, 注意: 这里元组的不可变的意思是子元素不可变. 而子元素内部的子元素是可以变, 这取决于子元素是否是可变对象.
11. range(重点, 难点)
数数
range() 可迭代对象
range(参数) [0, 参数)
range(参数1,参数2) [参数1, 参数2)
range(参数1,参数2,step) [参数1,参数2) 每隔step取一个
# 重点
for i in range(len(lst)):
i 索引
lst[i] 元素
print(i, lst[i])
四. 字典和集合
1. 什么是字典
字典是以key:value的形式来保存数据
用{}表示. 存储的是key:value
2. 字典的增删改查(重点)
1. 添加
dic[新key] = 值
setdefault()
2. 删除
pop(key)
3. 修改
dic[老key] = 值
update() 跟新字典
4. 查询
dic[key]
get(key, 值)
setdefault(key, value)
5. 遍历,字典是一个可迭代对象
3. 字典的相关操作
1. keys() 获取到所有的键
2. values() 获取到所有的值
3. items() 拿到所有的键值对
4. 字典的嵌套
字典的嵌套. 字典套字典
5. 集合(不重要). 去重复
集合中的元素是不重复的. 必须是可哈希的(不可变), 字典中的key
空集合:set()
空元组:tuple()
空列表:list()
非空集合: {123}集合, 集合其实就是不存value的字典
六.小数据池
1. 小数据池, id()
小数据池针对的是: int, str, bool
在py文件中几乎所有的字符串都会缓存.
id() 查看变量的内存地址
2. is和==的区别
is 比较的是内存地址
== 比较的是内容
当两个变量指向同一个对象的时候. is是True, ==也是True
3. 编码
1. ascii. 有: 数字, 字母, 特殊字符. 8bit 1byte 128 最前面是0
2. gbk. 包含: ascii, 中文(主要), 日文, 韩文, 繁体文字. 16bit, 2byte.
3. unicode. 包含gbk,ascii,big5... 32bit, 4byte
4. utf-8. 可变长度的unicode.
1. 英文: 8bit,1byte
2. 欧洲文字: 16bit 2byte
3. 中文: 24bit 3byte
不同的编码之间不能随意转换. 中国人gbk和德国人utf-8骂 想要沟通必须通过英文(unicode)(媒介)
在python3中. 默认的编码是unicode,我们的字符串就是unicode
在python2中. 默认的编码是ASCII. Cpython.c语言的默认编码是ASCII
unicode弊端:在存储和传输的时候. 是很浪费的
在存储和传输的时候不能直接使用unicode. 必须要对字符串进行编码. 编码成bytes类型
bytes: 字节形式的字符串
1. encode(编码格式) 编码
2. decode(编码格式) 解码
bytes是一种另类的字符串表示形式
"哈哈哈" => \xee\xab\x13\xee\xab\x13\xee\xab\x13
七. join,fromkeys和深浅拷贝
1. join,fromkeys
join()
"*".join("马虎疼") # 马*虎*疼 把传递进去的参数进行迭代. 获取到的每个元素和前面的*进行拼接. 得到的是字符串
split() 切割. 切割的结果是列表
列表和字典: 都不能在循环的时候直接删除
把要删除的内容记录在新列表中然后循环这个新列表. 删除列表(字典)
fromkeys()
坑1: 返回新字典. 不会更改老字典
坑2: 当value是可变的数据类型. 各个key共享同一个可变的数据类型. 其中一个被改变了. 其他都跟着变
2. 深浅拷贝(重点, 难点)
1. = 没有创建新对象, 只是把内存地址进行了复制
2. 浅拷贝 lst.copy() 只拷贝第一层.
3. 深拷贝
import copy
copy.deepcopy() 会把对象内部的所有内容进行拷贝
八. 文件操作
1. 文件操作
open 打开
f = open(文件路径, mode="模式", encoding="编码格式") 最最底层操作的就是bytes
打开一个文件的时候获取到的是一个文件句柄.
绝对路径
从磁盘根目录开始寻找
相对路径
相对于当前程序所在的文件夹
../ 上一层文件
文件夹/ 进入xxx文件夹
2. mode:
打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使用的是r(只读)模式
r: 读取,只读.
读取文件的相关操作
1. read()
默认: 读取文件内容(全部)
read(n) 读取n个字符
2. readline() 读取一行
3. readlines() 读取全部. 返回列表
(最重要)4. for line in f: 每次读取一行内容
w:
写入. 只写
创建文件
会清空文件
a:
也可以创建文件
追加写
r+: 对于文件而言. 应该有的操作就两个:读, 写
读写操作
w+:
写读操作
a+:
追加写读
所有带b的表示直接操作的是bytes, 当处理非文本文件的时候.
rb
wb
ab: 断点续传
r+b
w+b
a+b
深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.
3. 文件操作中关于文件句柄的相关操作
seek() 移动光标
f.seek(0) 移动到开头(最多)
f.seek(0, 2) 移动到末尾
seek:两个参数
1. 表示偏移量
2. 从xxx开始偏移, 默认0, 开头 1, 当前位置 2, 末尾
tell:
返回光标所在的位置
4. 文件修改, 实际操作(重点)
九. 初识函数
1. 什么是函数?
f(x) = x + 1
y = x + 1
函数是对功能或者动作的封装
2. 函数的语法和定义
def 函数名():
函数体
调用:
函数名()
3. 关于函数的返回值
return : 返回
1. 当程序没写过return, 不返回任何结果. 如果你非要接收. 接受到的是None
2. 当函数写return 值, 有一个返回值.
3. 当函数写了return 值1, 值2, 值3.... 返回多个结果. 多个结果打包成元组
4. 当程序执行到return, 函数结束执行
4. 函数的参数(部分)
小括号是什么, 小括号表示调用, 传参
什么是参数: 参数是给函数传递的信息
1.形参: 在函数声明的位置写的变量
1. 位置参数
2. 默认值
3. 动态传参 *, **
2.实参: 在函数调用的时候给函数传递的具体的值
1. 位置参数
2. 关键字参数
3. 混合: 位置, 关键字
3.传参: 把实参给形参的过程
4. 动态传参(重点) *, **
*, ** :
形参: 聚合
位置参数* -> 元组
关键字** -> 字典
实参: 打散
列表, 字符串, 元素 -> *
字典 -> **
形参顺序(重点):
位置, *args, 默认值, **kwargs
无敌传参
def func(*args, **kwargs): arguments参数 keyword-arguments关键字参数
pass
十.函数的进阶
1. 作用域和名称空间
名称空间: (用来存放名字(变量, 函数名, 类名, 引入的模块名)的)
1. 全局名称空间: 我们在py文件中自己写的变量, 函数.....
2. 内置名称空间: 我们python解释器提供好的一些内置内容(print, input....)
3. 局部名称空间: 在我们执行函数的时候.会产生一个局部名称空间. 放的是: 函数内部的内容(变量, 函数,类...)
名称空间可能会有无数个, 局部名称空间而言. 相对是独立的.一般互不干扰
作用域:
1. 全局作用域: 内置+全局
2. 局部作用域: 局部
globals() 查看全局作用域
locals() 查看当前作用域
2. 函数的嵌套
在函数中声明函数
在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置
3. nonlocal和global关键字(重点)
global: 在局部引入全局变量
nonlocal: 在局部...内层函数引入外层离他最近的那个变量.
十一. 第一类对象 闭包 迭代器
1.第一类对象-> 函数名 -> 变量名
函数对象对象可以像变量一样进行赋值
还可以作为列表的元素进行使用
可以作为返回值返回
可以作为参数进行传递
2.闭包 -> 函数的嵌套
内层函数对外层函数中的变量的使用
好处:
1. 保护变量不被侵害
2. 让一个变量常驻内存
如何通过代码查看一个闭包
__closure__: 有东西就是闭包. 没东西就不是闭包
3.迭代器 -> 固定的思路. for循环
一个数据类型中包含了__iter__函数表示这个数据是可迭代的
dir(数据): 返回这个数据可以执行的所有操作
判断迭代器和可迭代对象的方案(野路子)
__iter__ 可迭代的
__iter__ __next__ 迭代器
判断迭代器和可迭代对象的方案(官方)
from collections import Iterable, Iterator
isinstance(对象, Iterable) 是否是可迭代的
isinstance(对象, Iterator) 是否是迭代器
模拟for循环
lst= []
# 拿迭代器
it = lst.__iter__()
while 1:
try:
it.__next__()
except StopIteration:
break
特征:
1. 省内存(生成器)
2. 惰性机制
3. 只能向前. 不能后退
作用:统一了各种数据类型的遍历
十二. 生成器和各种推导式
1. 生成器
本质就是迭代器.
一个一个的创建对象
创建生成器的方式:
1. 生成器函数
2. 通过生成器表达式来获取生成器
3. 类型转换(看不到)
2. 生成器函数 (重点)
生成器函数中包含 yield , 返回数据和return差不多.
return会立即结束这个函数的执行
yield 可以分段的执行一个函数
生成器函数在执行的时候返回生成器. 而不是直接执行此函数
能向下执行的两个条件:
__next__() :执行到下一个yield
send() :执行到下一个yield, 给上一个yield位置传值
所有的生成器都是迭代器都可以直接使用for循环
都可以使用list()函数来获取到生成器内所有的数据
生成器中记录的是代码而不是函数的运行
def func():
print("我的天哪 ")
yield "宝宝"
gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存
当执行到__next__(), 运行此空间中的代码, 运行到yield结束.
优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
特点: 惰性机制, 只能向前. 不能反复
3. 各种推导式 (诡异)
列表推导式 [结果 for循环 if]
字典推导式 {结果(k:v) for循环 if}
集合推导式 {结果(k) for循环 if}
4. 生成器表达式 (重点)
(结果 for循环 if)