# Python基础
2021-03-08 17:30
标签:属性绑定 面向过程 重用 lse case star 开始 超过 形参与实参 原则:先定义后引用 Python的值传递都是引用传递(内存地址的传递) 内存管理:垃圾回收机制 垃圾:当一个变量值被绑定的变量名的个数为0,该变量值无法被访问到,称之为垃圾 引用数:变量绑定变量名的个数 del解除绑定 直接引用与间接引用: 变量组成部分: 赋值符号: = 将变量值的内存地址绑定给变量名 变量值:代表记录的事物的状态 变量命名: 命名基础 原则: 变量名应该见名知意 不能用数字开头 ps:尽量不要用拼音,不要用中文,在见名知意的情况下,尽可能短 命名风格 纯小写加下划线的方式 驼峰体 变量值的三个重要特征 id:反映的是变量值的内存地址(id不是地址),内存地址不同,则id不同 is:比较左右两值身份id是否相等 一般来说,两个值相等的整数变量id相同([-5, 256]),因为python解释器在启动之时就会在内存中事先申请一部分空间放入一系列常用的整数,被称为小整数池,事实上其他变量也有类似优化 ==:比较左右两个值是否相等 数字类型 int 整型 作用:记录年龄、号码、个数等的整数变量 定义:变量名 = 整数 float 浮点型 作用:记录小数、身高体重等的小数变量 定义:变量名 = 小数 数字类型的其他使用 字符串类型 作用:记录描述性质的状态、名字、一段话等 定义:用(‘ ‘," ",‘‘‘ ‘‘‘,""" """)包含的一串字符 其他使用: 列表类型:索引对应值,从0开始 作用:记录多个值,并且按照索引取指定位置的值 定义:在中括号内用逗号分隔开多个任意类型值的元素,一个值称为一个元素 其他使用: 在内存中的存储方式: 字典类型:key对应值,其中key通常为字符串类型,key对值有描述性的功能 作用:存多个值,每个值都有唯一一个key与之对应,key对值有描述作用 定义:在{}中由逗号分开为多个key: value,key必须是不可变类型,value可以是任意类型 其他使用: 布尔类型 作用:用来记录真假两种状态 定义:True False 其他使用:用来当作判断条件 可变不可变类型 定义:垃圾回收机制(GC)是Python解释器的一种机制,专门用来回收不可用的变量值所占用的空间 引用计数 标记清除 分代回收 背景:每次回收内存,都需要把所有对象的引用计数都遍历一遍,浪费时间,于是引入分代回收,采用“空间换时间”的策略 分代回收的核心思想:在历经多次扫描的情况下,都没有被回收的变量,GC机制认为其比较常用,于是降低对此类变量的扫描频率,依据权重,将其分为多个代,权重越高,扫描频率越低 接受用户输入 字符串格式化输出 print() % (重要)str.format()(python2.6及之后可用) 用来进行字符串格式化的函数(非输出函数) 在()中写变量名,在str中变量名由{}代替{}中数字代表变量序号 可以用字典的键值对传值 在str中可用一些格式使某个特定字符对字符串进行填充 若变量之前已赋值有变量值,则可以使用索引进行标记,否则需要使用变量名进行标记 最后的数字表示字符串总长度(若无附加字符时,就已超过总长度,则不会出现附加字符) 变量后可跟:.精度+f,表示精确到某位小数 f‘ ‘(python3.5及以后可用但效率低) f‘格式化字符串‘ 变量由{}括起 {}内的字符串可以被当作表达式运行 ? 算术运算符 赋值运算符 = 增量赋值 链式赋值 交叉赋值(交换变量值) 解压赋值(若解压字典,默认解压key) 比较运算符 逻辑运算符:用来连接多个条件加以判断的运算符 成员运算符: 身份运算符:is 什么是if判断:判断条件是否成立的语句 为什么要有if判断:增强程序的流程多样性 怎么用: while循环的语法与基本使用 死循环与效率问题 循环的应用 退出循环的两种方式 while循环嵌套 while + continue:结束本次循环 while + else for循环的语法与基本使用 什么是for循环:for循环shipython提供的第二种循环机制 为什么要用for循环: 如何用for循环: for循环应用 for循环嵌套 for + break for + continue for + else while循环与for循环的异同: 导入copy模块 使用函数copy.deepcopy() 在两个变量中对于任意不可变类型变量,指向的地址都相同,对于任意可变类型,指向地址都不同 ![](引用图像\批注 2020-07-30 000912.png) 作用 定义: 类型转换:str() 把任意其他类型转换成字符串 使用: 优先掌握 按索引取值 切片(从一个大的字符串中拷贝出一个子字符串) 长度(len) 成员运算符 in 和 not in 移除空白 strip 切分split 循环 需要掌握 lower,upper startswith, endswith split, rsplit join replace isdigit 了解 find, rfind index, rindex count center ljust rjust zfill expandtabs capatalize swapcase title is其他 作用:按位置存多个值 定义:list1 = [ ] 类型转换:list()可以转换能被for循环遍历的类型 使用 优先掌握 按索引存取值 切片 长度 成员运算 追加 插入 列表添加可迭代值的元素 删除 循环 需要掌握 count() index() clear() reverse() sort() 了解 列表比大小,原理同字符串比大小 补充(列表模拟) 队列 堆栈 作用:按照索引存放多个值,只能读,不能写 定义:tuple1 = () ()内用逗号分割开多个任意类型的元素 元组中的索引值也是指向元素内存地址 单独一个括号,只是包含,并不是元组 类型转换:tuple() 使用 作用 定义:dict1 = {},value可以是任意类型, key只能是不可变类型 类型转换:dict() 使用 优先掌握 按key存取值 长度len 成员运算 删除 keys()、values()、items() fromkeys() 循环 需要掌握 clear() update() setdefault() get() 容错性好 作用 定义 s = set(...), s = set() 定义空集合 在{}内用","分隔多个元素 每个元素必须是不可变类型 集合内没有重复的元素 集合内元素无序 类型转换 使用 优先掌握 intersection(s) ∩ union(s) ∪ difference(s) - symmetric_difference(s) ^ issuperset(s) >= issubset(s)
discard() remove() update() 需要掌握 isdisjoint() pop() clear() add() 人类与计算进行交互时,使用人类字符,而计算机只识别二进制数,因此字符必须翻译为二进制数 翻译的过程中必须参照特定标准,称之为字符编码表,存放字符与二进制数的映射关系 unicode(内存使用的固定编码) 兼容万国字符 与万国字符编码都有对应关系 采用16位二进制数对应一个中文字符串(个别生僻使用32、64位二进制数) 老的字符编码都可以转化为unicode,但不能通过unicode互相转化 ![](引用图像/批注 2020-08-24 000408.png) utf-8(unicode translate format-8) 可以作为字符编码格式直接存入硬盘 编码格式应设置成支持文件内容字符的格式 以什么编码格式存的就必须以什么编码格式取 指定文件头,修改默认的编码,即存入硬盘时的编码格式 在文件首行写 python3默认为:utf-8 python2默认为:ASCII python3的str类型默认直接存成unicode格式,不会乱码 保证python2的str类型不乱码,需强制存为unicode格式 python2有两种字符串类型 设置文件头模板 File ---- Settings ---- File and Code Templates ---- Python Script ![](引用图像/批注 2020-09-01 125649.png) 打开文件 with:上下文管理一、前言(总结)
1. 运行python程序的两种方式
交互式
脚本的方式
2. python程序运行的三个步骤
1. 先启动文本编辑器
. 文本编辑器会将刚刚读入内存的内容控制输出到屏幕上,让用户看到结果(不会检查语法)
4.注释
注释的形式
二、基础
1. 变量
什么是变量?
为什么要有变量
变量的基本使用
name = ‘Stephane‘ # 定义
print(name) # 引用
x = 10 # 10的引用次数为1
y = x # 10的引用次数为2
z = y # 10的引用次数为3
2. 变量名指向另一个变量
x = 10 # 10的引用次数为1
y = x # 10的引用次数为2
z = y # 10的引用次数为3
del x # 10的引用次数为2
del y # 10的引用次数为1
name = stephane
print(id(name))
2. type:不同类型的值表示记录不同的状态
name = stephane
print(type(name))
3. value:值本身
name = stephane
print(name)
5. is 与 ==
2. 数据类型(该处没有集合和元组)
age = 18
print(type(age)) # int
height = 1.78
print(type(height)) # float
2. 数字变量可以自加
3. 可以输出一个算式的结果
4. int 可与float之间进行算术运算
str1 = ‘19‘
str2 = "Hi"
str3 = ‘Do you know "Python"?‘
str4 = "I‘m a engineer!"
str5 = ‘I\‘m a engineer‘
# str6和str7赋值的字符串可换行,输出形式包括换行
str6 = ‘‘‘Hello world‘‘‘
str7 = """Hello
everyone!"""
list1 = [0, 0, 2, 6]
print(list1[3]) # 2
dict1 = {"Name": "Stephane", "Age": 19, "height": 178}
print(dict["Name"]) # Stephane
a = True
b = False
3. 垃圾回收机制详解
x = 10
print(x) # 10
l = [10, x] # 间接引用
dict1 = {"age": x} # 间接引用
z = x # 直接引用
# id相同
print(id(x)) # 直接引用
print(id(l[1]))
4. 用户交互
name = ‘Stephane‘
age = 18
print(‘My name is %s, I am %d‘ % (name, age))
print(‘My name is %(name)s, I am %(age)d‘ % {‘name‘: ‘Ste‘, ‘age‘: 18}) # 字典形式
# 使用索引标记
name = ‘Stephane‘
age = 18
print("My name is {0}, I am {1}".format(name, age))
# 使用变量名标记
print("Today is {week}.".format(week=‘Mon‘))
name = ‘Stephane‘
age = 18
print("My name is {0}, I am {0}".format(name, age))
res = ("My age is {age}, I am {name}".format(name=‘ZHS‘, age=18))
print(res)
print(‘{x:=
name = ‘Stephane‘
age = 18
print(f‘My name is {name}, and I am {age} years old.‘)
print(f‘10+3‘) # 10+3
print(f‘{10+3}‘) # 13
f"{print(‘abcd‘)}" # abcd
5. 基本运算符
a = 10
b = 20
a, b = b, a
print(a, b) # 20 10
list1 = [1, 2, 3, 4]
a, b, c, d = list1
print(a, b, c, d) # 1 2 3 4
print(list1) # [1, 2, 3, 4]
list1 = [1, 2, 3, 4]
a, b, c, *_ = list1
print(a, b, c) # 1 2 3
print(_) # [4]
6. 流程控制
6.1 if判断
"""
语法1:
if 条件:
语句1
语句2
...
语法2:
if 条件:
语句1
...
else
语句1
...
语法3:
if 条件1:
语句1
...
elif 条件2:
语句1
...
...
else:
语句1
...
"""
6.2 while循环(条件循环)
"""
while 条件:
代码1
代码2
...
"""
"""
while 条件1:
语句1
...
while 条件2:
语句2
...
或
while 条件1:
语句1
...
while 条件2:
语句2
...
break
break
"""
"""
while 条件:
语句1
...
else:
语句2
...
"""
6.3 for循环
"""
for 变量名 in 可迭代对象:
# 可迭代对象可以是list,string,dictionary,set,tuple
语句1
语句2
...
"""
"""
for 变量名1 in 可迭代对象1:
语句1
for 变量名2 in 可迭代对象2:
语句2
...
"""
7. 深浅copy
7.1 深copy
7.2 浅copy
8. 基本数据类型及其内置方法
8.1 数字
8.1.1 int
8.1.2 float
8.1.3 complex
8.2 字符串
# 正向取
str = "Hello"
print(str[1]) # e
# 反向取
print(str[-1]) # o
# 只能取
str[1] = ‘a‘ # 错误,字符串不可修改
# 左闭右开区间
str = "HelloWorld"
print(str[0:3]) # Hel
# 步长
print(str[0:5:2]) # Hlo (start = stop)
str = "Hello"
print(len(str)) # 5
# 判断一个子字符串是否在大字符串中
str = "hello"
print(‘h‘ in str) # True
print(‘a‘ not in str) # True
# strip只去两边,不去中间
str = " hello World "
print(str.strip()) # "hello world"
print(str.lstrip()) # "hello world "
print(str.rstrip()) # " hello world"
str1 = "********hello********"
print(str1.strip(‘*‘)) # "hello"
# 把一个字符串按照某种分隔符(默认为空格)进行切分,得到一个列表(不包括分隔符)
# split(sep, maxsplit)
str = "a:b:c:d"
list1 = str.split(‘:‘)
print(list1) # [‘a‘, ‘b‘, ‘c‘, ‘d‘]
list1 = str.split(‘:‘, 2)
print(list1) # [‘a‘, ‘b‘, ‘c:d‘]
# for循环
str = "abCdEF"
print(str.lower()) # abcdef
print(str.upper()) # ABCDEF
str = "abcdefg"
print(str.startswith("abc")) # True
print(str.endswith("efg")) # True
str = "a:b:c:d"
list1 = str.split(‘:‘)
print(list1) # [‘a‘, ‘b‘, ‘c‘, ‘d‘]
list1 = str.rsplit(‘:‘)
print(list1) # [‘a‘, ‘b‘, ‘c‘, ‘d‘]
list1 = str.rsplit(‘:‘, 2)
print(list1) # [‘a:b‘, ‘c‘, ‘d‘]
# 将列表拼接成字符串
# 列表中每个元素为字符(串)
list1 = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
str1 = ‘:‘.join(list1) # a:b:c:
# replace(old, new, count)
str1 = "Hello World"
print(str1.replace("H", "U")) # "Uello World"
# 判断字符串是否由纯数字组成
str1 = "123123123123"
str2 = "1a2b3c"
print(str1.isdigit()) # True
print(str2.isdigit()) # False
str1 = "Stephane"
# find和rfind若找不到会返回-1
print(str1.find(‘e‘)) # 2 返回查找字符串在大字符串中的起始索引
print(str1.rfind(‘e‘)) # 7 返回从右查找字符串在大字符串中的起始索引
str1 = "Stephane"
# index和rindex若找不到会直接报错
print(str1.find(‘e‘)) # 2 返回查找字符串在大字符串中的起始索引
print(str1.rfind(‘e‘)) # 7 返回从右查找字符串在大字符串中的起始索引
str1 = "Ada is Ada"
print(str1.count("Ada")) # 2 返回目标字符串出现的次数
# center(wideth, fullchar) 使字符串居中,并用填充字符填充至指定长度
str1 = "hello"
print(str1.center(11, ‘*‘)) # ***hello***
# ljust(wideth, fullchar)使字符串左对齐,并用填充字符填充至指定长度
str1 = "hello"
print(str1.ljust(11, ‘*‘)) # hello******
# ljust(wideth, fullchar)使字符串右对齐,并用填充字符填充至指定长度
str1 = "hello"
print(str1.rjust(11, ‘*‘)) # ******hello
# zfill(wideth)使字符串右对齐,并用0填充至指定长度
str1 = "hello"
print(str1.rjust(11, ‘*‘)) # 000000hello
# expandtabs(tabsize)若字符串中有制表符,指定制表符所包含的空格数
str1 = "hello\tworld"
print(str1.expandtabs(2)) # hello world
# capatalize()使字符串首字母大写
# swapcase()使字符串中的大小写反转
# title()使每个单词首字母大写
# islower()
# isupper()
# isspace()
# istitle()
# isalnum()
# isalpha()
# isidentifier() 判断是否为合法标识符
# isdecimal()
# isnumberic() 可判断数字、中文数字、罗马数字等
8.3 列表
list1 = [111, 222, 333, 444]
# 正向取
list1[1]
# 反向取
list1[-1]
# 可修改
list1[0] = 100
list1[4] = 555 # 索引不存在,报错
list1 = [11, 20, 36, 33, 22, 10]
print(list1[0:5:2]) # [11, 36, 22]
print(list1[5:0:-2]) # [10, 33, 20]
len()
list1 = [111, 222, 333, 444]
print(111 in list1) # True
print(555 not in list1) # True
# append(object)
list1 = [111, 222]
list1.append(333)
list1.append(444)
print(list1) # [111, 222, 333, 444]
# insert(index, object)
list1 = [111, 333]
list1.insert(1, 222)
print(list1) # [111, 222, 333]
# extend(iterable)
list1 = [111, 222, 333]
list2 = [444, 555]
list1.extend(list2)
print(list1) # [111, 222, 333, 444, 555]
list1 = [111, 222, 333]
del list1[0] # 通用删除方法,没有返回值
print(list1) # [222, 333]
list1 = [111, 222, 333]
# pop(index) 返回值为被删除的元素,不指定索引默认删最后一个元素
x = list1.pop(2)
print(list1) # [111, 222]
print(x) # 333
# remove(object) 无返回值,删除指定元素
list1 = [111, 222, 333]
x = list1.remove(111)
print(list1) # [222, 333]
print(x) # None
list1 = [111, 222, 333]
for item in list1:
list1 = [10, 100, 10, 10, 1000]
print(list1.count(10)) # 3
list1 = [101, 1002, 103, 104, 10005]
print(list1.index(103)) # 2,从左开始查找
# clear() 将整个列表的元素删除,留下空列表
list1 = [101, 1002, 103, 104, 10005]
list1.clear()
print(list1) # []
# reverse() 将列表元素倒置
list1 = [101, 1002, 103, 104, 10005]
list1.reverse()
print(list1) # [10005, 104, 103, 1002, 101]
# sort(key, reverse) # 默认升序,当reverse为真,为降序
list1 = [101, 1002, 103, 104, 10005]
list1.sort()
print(list1) # [101, 103, 104, 1002, 10005]
list1 = [100, ‘a‘, 1000]
list1.sort() # 不同类型混合,不可排序
# 对相应位置的元素为同种类型
list1 = [‘aaa‘, 123, 100]
list2 = [‘a‘, 100, 1000]
print(list2
list1 = []
# 入队操作
list1.append(100)
list1.append(200)
list1.append(300)
print(list1)
# 出队操作,先进先出
print(list1.pop(0))
print(list1.pop(0))
print(list1.pop(0))
list1 = []
# 入队操作
list1.append(100)
list1.append(200)
list1.append(300)
print(list1)
# 出队操作,后进先出
print(list1.pop())
print(list1.pop())
print(list1.pop())
8.4 元组(不可变的列表)
tuple1 = (100) # int
tuple1 = (100,) # tuple
8.5 字典
# 可使用这种方式进行定义/类型转换
dict1 = dict(x=1, y=2, z=3)
print(d) # {‘x‘: 1, ‘y‘: 2, ‘z‘: 3}
print(type(d)) # dict
# 也可使用这种方式创建字典(快速初始化),但value为相同值
Ages = [‘a‘, ‘b‘, ‘c‘]
dict1 = {}.fromkeys(Ages, 19)
print(dict1)
# 可以使用这种方法
info = [
[‘11‘, ‘22‘],
[‘33‘, ‘44‘],
[‘55‘, ‘66‘]
]
info = dict(info)
print(info)
dict1 = {‘a‘: 100, ‘b‘: 200}
print(dict1[‘a‘]) # 100
dict1[‘a‘] = 150 # 赋值
dict1[‘c‘] = 300 # 创建key
print(dict1) # {‘a‘: 150, ‘b‘: 200, ‘c‘: 300}
# 创建字典时,若一个key出现若干次,则以最后一次出现的value为准
# 若有若干个key相同,则该key只统计一次
dict1 = {‘a‘: 100, ‘b‘: 200, ‘a‘: 150, ‘b‘: 250}
print(len(dict1)) # 2
# del
dict1 = {‘a‘: 100, ‘b‘: 200}
del dict1[‘a‘]
print(dict1) # {‘b‘: 200}
# pop() 根据key删除
dict1 = {‘a‘: 100, ‘b‘: 200}
l = dict1.pop(‘a‘)
print(dict1) # {‘b‘: 200}
print(l) # 100 pop()返回删除的键值对的值
# popitem() 随机删除
dict1 = {‘a‘: 100, ‘b‘: 200}
l = dict1.pop(‘a‘)
print(dict1)
print(l) # popitem()返回一个元组,包含删除的key和value
# keys() 返回字典中所有的key组成的列表
# values() 返回字典中所有的value组成的列表
# items() 返回所有键值对组成的列表(每个键值对分别为子元组)
# fromkeys([key1, key2], value) 给字典中添加可迭代列表中的所有key,value均为fromkeys的第二个参数值,返回值为包含相应键值对的字典
# 但子列表中所有的key对应的value始终指向同一块地址
dict1 = {}
dict2 = dict1.fromkeys([‘a‘, ‘b‘], 100)
print(dict1) # {}
print(dict2) # {‘a‘: 100, ‘b‘: 100}
dict1 = {}
for key in dict1.keys():
...
for value in dict1.values():
...
for key, value in dict1.items():
...
dict1 = {‘a‘: 100, ‘b‘: 200}
dict2 = {"c": 100}
dict2.update(dict1)
print(dict2) # {‘c‘: 100, ‘a‘: 100, ‘b‘: 200}
# 旧字典当中存在的key会被更新,旧字典当中不存在的key会由新字典追加
# setdefault(key, defalut) defalut为默认的值,返回值为字典中该键对应的值
dict1 = {‘a‘: 100, ‘b‘: 200}
dict1.setdefault(‘b‘: 10000) # 若原字典中有该键,则忽略其中的默认值,即不进行修改
dict1.setdefault(‘c‘: 10000) # 若原字典中没有该键,则将该键添加到字典各种,并将默认值作为其值
print(dict1) # {‘a‘: 100, ‘b‘: 200, ‘c‘: 10000}
# get(key) 返回key对应的value,若key不存在会返回None
dict1 = {‘a‘: 100, ‘b‘: 200}
print(dict1.get(‘a‘)) # 100
print(dict1.get(‘c‘)) # None
8.6 集合
# discard(args)
# 删除指定元素,若不存在该元素,do nothing
s = {100, 200, 300}
s.discard(100)
print(s) # {200, 300}
s.discard(400)
print(s) # {200, 300}
# remove(args)
# 删除指定元素,若不存在该元素,则会报错
s = {100, 200, 300}
s.discard(100)
print(s) # {200, 300}
s.discard(400)
print(s) # 报错
# update(s) 将新集合中的元素加入旧集合,并去重
s = {100, 200, 300}
s1 = {150, 200, 300, 450}
s.update(s1)
print(s) # {100, 200, 300, 150, 450}
# isdisjoint(s) 若两个集合交集为空,返回True,否则返回False
s = {100, 200, 300}
s1 = {150, 200, 300, 450}
print(s.isdisjoint(s1)) # False
s1 = {450, 150}
print(s.isdisjoint(s1)) # True
8.7 总结与分类
9. 文件处理
9.1 字符编码
9.1.1 编码与解码
9.1.1.1 编码
9.1.1.2 解码
9.1.1.3 编码解码
x = ‘上‘
x = x.encode(‘gbk‘) # 将unicode转为gbk格式
print(x, type(x)) # b‘\xc9\xcf‘
x = b‘\xc9\xcf‘
x = x.decode(‘gbk‘) # 按什么方式编码,则按什么方式解码
print(x, type(x)) # 上
9.1.2 如何保证不乱码
# coding: xxx 如gbk,utf-8
str = u‘你好‘
str1 = ‘你好‘ ----> str # 字符串值会按照文件头指定的编码格式存入变量值的内存空间
str2 = u‘你好‘ ----> unicode
9.1.3 文件头
9.2 文件处理
9.2.1 文件处理基本流程
- f = open(r‘文件路径‘, [模式(默认为rt)], [encoding=‘xxx‘])
- r 指rawstring 原生字符串,也可不加"r",将文件路径的"\"改为"/"
- 类UNIX系统的默认encoding为utf-8,Windows默认为GBK
9.2.2 资源回收与with语法
# 在with的子代码运行结束后,自动执行f.close()
with open(‘a.txt‘) as f:
res = f.read()
print(res)
# 可打开多个文件
with open(‘a.txt‘) as f, open(‘b.txt‘) as f1:
res = f.read()
print(res)
res1 = f1.read()
print(res1)
9.2.3 操作模式
9.2.3.1 控制文件读写操作的模式