Python基础语法总结(3.x)
Python基础语法总结(3.x)
花了一段时间学习python,现在来系统总结一下py的基础语法以及py的独特之处,以备日后查阅。
空格做缩进!空格做缩进!空格做缩进!
注释
# 这是一行注释
"""
这也是注释,不过是区域注释
"""
# “‘”’ 这样是错误的! 引号必须成对出现!
# “”“” 双引号套双引号也不可以!
# ‘“”’ 正确。
# 即双引号不能单独重复套用, 单引号也不能单独重复套用
输入输出
标准输入、输出:
输入:
#标准输入【键盘输入】
input() #接受任何输入,默认字符串化处理并返回此字符串。
input("any tips you want users to see") #括号内可以写任何你想要用户看到的提示。
输出:
print() #直接输出,任何类型都可。包括字符串表达式。
print("the length of %s is %d" %(s, x)) #与 C 语言类似。
print(x, end='') #取消换行。
print(x, '1111') #如此也可以直接输出,py中变量可接字符串直接输出
#格式化输出:
## 第一种格式化输出:
print("name: %s, age: %d" %(name, age))
## 第二种格式化输出
name = "xxx"
age = 11
print(f"{name}的年龄:{age}")
## 第三种格式化输出:
print("{}的年龄:{}".format(name, age))
#反转义
## 使用r来反转义
print(r"\n\t")
## 使用\\来反转义
print("\\n, \\t")
## 指定字符反转义
str.replace("\n", r"\n")
## 使用repr()函数不转义源字符串并赋值给新字符串 注意!repr()函数所在库需要import!
a = "\n\t"
b = repr(a)
这里着重说一下:
-:表示左对齐;
.3:表示小数点后三位,不指定位数也可以.*。
文件输入、输出
文件操作,首先记得open()打开文件! 使用完毕后记得关闭连接!
文件输入:
#文件输入
file_1 = open(fileName, mode) #fileName:要读取的文件名称, mode:读取模式--->见下表 open()函数返回一个文 件对象。
#write() 覆盖输入 truncate the file and write things in.
file_1.write('111') #不支持列表及其他的元素,只支持字符串
#writeline() 覆盖输入, 但是支持列表等数据结构
file_1.writelines(["1111111, \t 22222222 \n"]) #支持字符串以及列表
file_1.writelines(set('111, 222, 333333, a, b, c, d')) # set支持
file_1.writelines(('1111', '22222', 'aaaaabbdfgsf\n\n')) #元组全部可以写入
file_1.writelines({'username': '11111', 'pwd': '22222'}) # 字典 只能 写进去key
#flush()清空缓冲区
file_1.flush()
##如需追加写入,则更换文件打开模式 mode ----> a/a+
open(fileName, "a")
open(fileName, "a+")
文件输出:
#文件输出
file_1 = open(fileName, mode) #fileName:要读取的文件名称, mode:读取模式--->见下表
## 读取整个文件,将文件内容放到一个字符串变量中。 缺点:文件过大时不适合使用。尤其是文件大小大于内存大小时,更是不能使用。
## 直接读取字节到字符串中,包括了换行符
file_1.read() #返回值是读取到的内容
## readline()方法每次读取一行;返回的是一个字符串对象,保持当前行的内存 缺点:比readlines慢的多
## readline()读取整行,包括行结束符,并作为字符串返回
file_1.readline() #返回值是读取到的内容
## 特点:一次性读取整个文件;自动将文件内容分析成一个行的列表
## 作为一个字符串列表返回。
file_1.readlines()
其中mode(读取模式)有如下几种:
- r 只读,文件指针在文件开头,【默认模式】。
- rb 二进制格式只读,文件指针在文件开头。
- r+ 读写,文件指针在文件开头。
- rb+ 二进制格式读写,文件指针在文件开头。
- w 只写。原文件存在则删除原有内容,从开头开始编辑;原文件不存在则创建文件。
- wb 二进制只写。原文件存在则删除原有内容,从开头开始
编辑;原文件不存在则创建文件。 - w+ 读写,原文件存在则删除原有内容,从开头开始
编辑;原文件不存在则创建文件。 - wb+ 二进制读写。原文件存在则删除原有内容,从开头开始
编辑;原文件不存在则创建文件。 - a 追加写入。原文件存在则从结尾开始编辑;原文件不存在则创建文件。
- ab 二进制追加写入。原文件存在则从结尾开始编辑;原文件不存在则创建文件。
- a+ 读+追加写。原文件存在则从结尾开始编辑;原文件不存在则创建文件。
- ab+ 二进制读+追加写。原文件存在则从结尾开始编辑;原文件不存在则创建文件。
Character Meaning --------- --------------------------------------------------------------- 'r' open for reading (default) 'w' open for writing, truncating the file first 'x' create a new file and open it for writing 'a' open for writing, appending to the end of the file if it exists 'b' binary mode 't' text mode (default) '+' open a disk file for updating (reading and writing) 'U' universal newline mode (deprecated) ========= ===============================================================
with open 语句块
语句块打开文件,则在语句块运行结束,则会自动关闭文件连接。比较安全。推荐使用
with open("test_1.txt", "r") as file_1:
all = file_1.read()
print(all)
流程控制
判断
#单分支
if 条件:
语句块
#多分支:
if 条件1:
语句块
elif 条件2:
语句块
...
else:
语句块
#冒号千万别忘记,不然会出语法错误。
循环
#while循环
while condition:
语句块
#while-else 条件不成立,则执行else
while condition:
语句块
else:
语句块
#for循环 for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
# else:循环结束时执行。
for 元素 in 序列
语句块
else
语句块
#使用索引来遍历。range函数的具体用法见下文。
for index in range(len(list_name)):
statements
else:
statements
range()函数:可以生成数字序列,用于遍历。
-
生成正数序列时
- 左闭右开
- range(start, end, length) 也可不写start,默认从0开始。
-
生成负数序列时
- 左闭又开
- range(start, end, length[有方向!]) 如果端点包括0,则会比生成正数多生成一个数字
不论是生成正数还是生成负数序列,length步长的方向必须与前面序列的方向相同,不然会返回空序列。
比如:range(1, 10, 1) 即1 -> 10 每次都加1
range(1, 10, -1) 则错误!1 -> 10 每次都减1,永远到不了10,会返回空序列。
range(-1, -10, -1) -1 -> -10 每次减1,则可以
range(-1, -10, 1) -1 -> -10 每次加1,则错误!会返回空序列。
range(5) #生成0-4的数字序列
range(6,9) #生成6-8的数字序列
pass:不做任何事情,用于占位。
变量
- 无类型声明,首次赋值才会创建。可在后期更改其类型(赋值不同类型数据)。
- 变量命名规则与C/C++相同。
- 允许多变量连续赋值。
a = b = c = 1 #多变量同时赋与相同的值。
a = b = c = 1 = 'a' = 3 #多变量同时赋予不同类型的值。
- 函数外部创建的变量为全局变量。函数内部若想创建全局变量则需加“global”关键字。函数内部若想改变外部全局变量的值,也需先使用global关键字声明变量后再更改其值。
x = 2 #全局变量
def function:
global y = 1 #函数内部创建全局变量。
global x
x = 'aaa' #函数内部更改外部全局变量的值。
-
变量交换
1) a = temp a = b b = temp 2) a, b = b, a
数据类型
内置数据类型:
- 文本类型:str
- 数值类型:int,float,complex(复数)
- 序列类型:list(列表),tuple(元组),range(自动生成数字序列)
- 映射类型:dict(字典)
- 集合类型:set,frozenset(返回冻结集合)
- 布尔类型:bool
- 二进制类型:bytes,bytearray,memoryview
⚪获取数据类型:type()函数。
⚪赋值时即自动设置了变量的数据类型。
⚪也可使用对应的构造函数设置特定数据类型。(构造函数名称无改变)
指定变量类型
python可以使用各个基本类型的构造函数来构造(强转)数据类型。
- int() 可接收整数、浮点(向下取整)、表示完整的字符串。
- float() 可接收整数、浮点、表示整数或者浮点的字符串。
- str() 可接收整数、浮点、字符串。
数字类型
int、float、complex。
- 复数创建形式:a + bj
- 复数无法转为其他数据类型。
z = 1 + 2j #complex
关于创建随机数:python无直接可用的random()函数,但有random内置模块,可以调用其中的randrange(left,right)方法来创建随机数。 左闭右开。
其中的random()函数可以返回 [0-1) 的随机数。
import random
x = random.randrange(1, 10) #生成1-9的随机数字。
y = random.random() #生成 [0-1)的随机数字 此处若不熟悉seed()函数,则无需手动设定,py会自动设定seed。
字符串
字符串是字面量,不可更改。如需要更改,则解释器自动创建新字符串字面量,将原字符串中内容和更改内容写入新的字符串字面量。
-
python无字符类型,单个字符即为长度为1的字符串。
-
字符串是数组,可以直接索引。
-
字符串名称[left :rigth]: 裁切。范围:[left,right)
-
负索引:从右往左,从-1开始。
-
获取字符串长度:len()方法。
-
a in b:表示判断a是否是b的字串。
-
字符串拼接:可以拼接多个,但不能是str以外的类型。
可以使用format()方法将其他类型的数据拼接在同一个字符串中。
也可以使用join方法将其他集合、元组、…中的元素使用规定符号连接 -
字符串内置方法此处不再赘述。
#012345678..12
x = "hello python"
#-12 ... -2-1
#字符串拼接
quantity = 3
itemno = 567
price = 49.95
txt1 = "I want {} pieces of item {} for {} dollars."
txt_ = txt1.format(quantity, itemno, price)
#使用索引表示确保参数被放置在正确的位置。
txt2 = "I want to pay {2} dollars for {0} pieces of item {1}."
txt_ = txt2.format(quantity, itemno, price)
#使用join()函数将list、元组转成字符串,并每个元素用-连接。
str = '-'
ans_list = [1, 2, 3]
ans_tuple(1, 3, 4)
str.join(ans_list)
str.join(ans_tuple)
方法 | 作用 |
---|---|
upper() | 转大写 |
lower() | 转小写 |
isupper() | 判断是否是大写 |
islower() | 判断是否是小写 |
startwith() | 判断是否以指定字符/字符串开头 返回bool值。 |
endswith() | 判断是否以指定字符/字符串开头,返回bool值 |
index() | 返回指定字符第一次出现的位置,找不到指定字符则报错 |
count(char/str, startIndex, endIndex) | 统计指定字符在字符串中出现的次数, 后两个参数可以不填 |
capitallize() | 将字符串开头大写 |
strip()/ strip(‘ab’) | 不填参数默认去除字符串两边的空格。传入参数则删除字符串开头和结尾有参数内字符的字符 |
split()/split(’-’) | 将字符串按照指定字符进行分割,返回值是list集合 不填参数则不拆分 |
join() | 见上方讲解 |
replace(substring, newstring, max) | substring指被替换的字符串,newstring指要替换的字符串,max表示替换次数 |
find()/rfind() | 寻找指定字符串出现的索引位置,找不到则返回-1 rfind()则是从右向左找 |
isalpha() | 检测字符串是否只有字母和数字组成 |
isdigit() | 检测字符串是否只有数字组成 True: Unicode数字,byte数字(单字节),全角数字(双字节) False: 汉字数字,罗马数字,小数 Error: 无 |
isdecimal() | 检测字符串是否只有数字组成 True: Unicode数字,全角数字(双字节) False: 罗马数字,汉字数字,小数 Error: byte数字(单字节) |
isnumeric() | 检测字符串是否只有数字组成 True: Unicode数字,全角数字(双字节),罗马数字,汉字数字 False: 小数 Error: byte数字(单字节) |
encode(编码类型) | 将字符串转换为字节,参数为编码类型,不填则默认 该方法返回编码后的字符串,它是一个 bytes 对象。 |
decode() | 用法待补充 |
运算符
算术运算符
注意幂运算符和地板除是py新引入的。
赋值运算符
注意最后几个:
- &= : 按位与
- |=: 按位或
- ^=: 按位异或
- >>=: 二进制右移
- <<=: 二进制左移
比较运算符
逻辑运算符
这里区别于C/C++,直接使用英文作为运算符。
身份运算符
用于比较对象,不是比较值,是比较两个对象是否为同一个对象(指向同一个内存区域)
成员运算符
可用于判断子序列是否在母序列中出现。
位运算符
函数
使用def关键字定义:
def 函数名(参数列表):
函数体
def sum(a, b = 2):
print(a + b)
#函数调用
#必需参数 要按照声明顺序传入。
sum(a, b)
#关键字参数: 可以不按照声明顺序传入,解释器可以根据参数名自动匹配参数。
sum(b = 2, a = 3)
#默认参数 函数调用时若没有传入指定数量的参数,则会使用函数定义时对应参数的默认值。
sum(a = 2)
a = 2
sum(a)
#不定长参数 加了*的参数会以元组的形式存储所有未命名参数,即超过fomal args数量之后传入的参数。
def sum(fomal args, *args_tuple)
print('args' + args)
print('args_tuple' + args_tuple)
sum(1,1,2,3,4)
sum(1) #也可以不传递不定长参数,只传递必要的定长参数。
# **参数 以字典形式导入。
def sum(fomal args, **args_dict)
print(args_dict) #即输出 传入的字典
sum(1, a = 2, b = 3) #输出: {'a': 2, 'b': 3}
#*可单独出现于函数参数列表中,但其后位置的参数必须以关键字形式传入。
def sum(a, *, b)
print(a + b)
sum(a, b = 2) #正确。
sum(a, b) #错误。
- 匿名函数:lambda表达式。
参考java中的lambda表达式,但python中只允许其包含一句语句。
lambda [arg1 [,arg2,.....argn]]:expression
sum = lambda a, b: a + b
print(sum(20, 30))
- return 语句
不使用的话则函数会返回None,与C/C++还是有区别。
切片操作
-
适用于字符串、元组、列表、集合。
-
切片格式:
- [start : end : step]
- step不可为0,默认为1.
- 步长方向以start正负为标准。start为正,步长则为正方向;start为负,步长则为负方向。
- 切片越界不会报错! 越界即只有左端点元素符合要求。
#正向切0,1,2 步长为1
print(ans_list[0:3:1])
#错误用法!
#print(ans_list[0:3:-1])
#反向切-1 步长为向左,1
print(ans_list[-1:0:-1])
#错误用法!
#print(ans_list[-1:0:1])
#省略end与step(step默认1)
print(ans_list[2:])
#省略start与end
print(ans_list[::1]) #正向切片
print(ans_list[::-1]) #反向切片,即向左切片。
python集合
python有四种集合数据类型:
- 列表(List)是一种有序和可更改的集合。允许重复的成员。
- 元组 (Tuple)是一种有序且* 不可更改 *的集合。允许重复的成员。
- 集合(Set)是一个无序和无索引的集合。没有重复的成员。
- 词典(Dictionary)是一个无序,可变和有索引的集合。没有重复的成员。
只有元组,不可更改!
列表
可进行:索引、切片、加、乘、检查成员。
-
创建:[元素1, 元素2, 元素3, …, 元素n]
-
访问:索引访问。有负索引(从后往前)。左边第一项索引为0或-n,右边第一项索引为n - 1或-1。
-
指定范围访问:[left : right] 返回一个新列表 访问范围:[left, right)
-
遍历:索引遍历。
-
确定元素是否在列表中: 元素 in 列表名 返回true/false
-
列表长度:len()方法。
-
尾部追加元素:append()方法。
-
指定索引添加元素:insert(index, 元素)方法。
-
删除指定元素:remove(元素)、 del 列表名[index]
-
删除指定索引位置元素:pop(index) 如未指定索引,则删除尾部元素。
-
删除列表: del 列表名
-
清空列表:clear()
-
复制列表:
list2 = list1 只是对列表list1的引用,即list2与list1指向同一内存对象。
使用copy()方法可以复制列表。
使用内置方法list()可以复制列表。
#使用copy()方法
thislist = ["apple", "banana", "cherry"]
mylist = thislist.copy()
#使用list()方法
thislist = ["apple", "banana", "cherry"]
mylist = list(thislist)
- 合并两个列表
1、+拼接
2、 append()方法,将list2中元素一个个拼接到list1中。
3、extend()方法,将list2中元素一个个拼接到list1中。
区别:append()可以拼接一个元素,也可以拼接一个集合(此时将集合看作是一个元素添加进入。)
而 extend()只可以添加一个集合,且是将两个集合完美拼接。
- 也可以使用list()构造方法构造一个list对象。
#创建列表 1)使用[]创建 2)使用list()函数创建。
ans_list = [1, 2, 3]
ans_list = list('123') #list()函数输入字面量进行创建时,只能输入字符串 且只接收一个参数。
ans_list = list(tup) #tup:元组。
#统计元素出现个数
ans_list.count()
#返回指定元素索引号码
ans_list.index(element)
#添加元素
ans_list.append(element) #将指定元素添加到列表末尾
ans_list.insert(index, element) #将指定元素添加到指定索引位置
#合并列表(追加元素append())
ans_list.append(any Type element) #简单追加,即时是列表也将其视作一个元素,整体追加。
ans_list.extend(list Type only) #将参数list中的元素一个个加入到原list中。 且extend()只可以接收list
#移除元素
ans_list.pop() #默认移除最后位置元素
ans_list.pop(index) #移除指定index位置元素
ans_list.remove(element) #移除指定元素
del ans_list[index] #移除指定index位置元素
#成员运算符
‘1’ in ans_list
'1' not in ans_list
#列表运算
###列表相加 即暴力合并
print(ans_list1 + ans_list2)
###列表相减 不支持!
###列表相乘 不支持! 列表可以乘数字
print(ans_list1 * 2) #列表中全部元素整体出现2次 [1, 2, 3, 1, 2, 3]
###列表相除 不支持!
##列表逻辑运算
###列表and
print(ans_list1 and ans_list2) #以最后一个列表/数字/任何值、对象为准
###列表or
print(ans_list1 or ans_list2) #以第一个列表/数字/任何值、对象为准
###列表排序 sort(key=,reverse=)
print(ans_list.sort()) #正序
print(ans_list.sort(reverse=True)) #倒序
print(ans_list.sort(key=len)) #根据元素长度进行排序 python3中取消了cmp参数,也不支持直接向sort中传函数,需要构造# 排序函数传递给key实现排序规则自定义。
#####这里的cmp传递给key的规则、用法待之后更新。
列表内置方法:
元组
有序,不可更改! ------->这也是和列表的唯一区别。
#创建
tuple_ = (1, 2, 3)
tuple_1 = (2, 3, 4)
tuple_1 = (1, ) #单个元素时,要有',' 否则会被当做整型处理。
tuple_1 = () #空元组
## tuple()函数创建元组 列表、元组、set集合、字典(只会将key转换为元组)、字符串(按位转换)
set_1 = {1, 2, 3, 4, 9, 5}
list_1 = [1, 2, 3, 4, 9, 5]
tuple_1 = (1, 2, 3 ,4 ,5)
dict_1 = {'username': "1111", 'admin': '2222'}
str_1 = 'fghjk_ghjkl-GHJKL;'
tuple_1 = tuple(list_1)
tuple_1 = tuple(set_1)
tuple_1 = tuple(tuple_1)
tuple_1 = tuple(dict_1)
#访问也是索引访问,有负索引。
print(tuple_1[1])
#可指定索引范围访问,返回一个新元组。【切片】
print(tuple_1[-1, -3, -1])
#元组创建后即不可更改其值,但可将其转换为列表后更改其值。
x = ("apple", "banana", "cherry")
y = list(x)
y[1] = "kiwi"
x = tuple(y) # ("kiwi", "banana", "cherry")
#遍历可以用for循环
#in关键字与列表用法相同
#长度:len()
#注意,创建仅有一个项目的元组,要在该项目后添加 * 逗号 *。
thistuple = ("apple",)
#不是元组
thistuple = ("apple")
#del可完全删除元组。
del thistuple
#统计元组内元素个数
tuple_1 = (1, 2, 3)
print(tuple_1.count())
# 元组运算:
## +
tuple_1 = (1, 2, 3)
tuple_2 = (4, 5, 6)
print(tuple_1 + tuple_2) # 输出(1, 2, 3, 4, 5, 6)
## *
tuple_1(1, 2, 3)
print(tuple_1 * 3) #输出(1, 2, 3, 1, 2, 3, 1, 2, 3)
#元组和元组间不可进行四则运算的 - * / 以及% 取余
#但是可以使用逻辑运算符进行取交、取并。
tuple_ and tuple_1 #交集
tuple_ or tuple_1 #并集
#元组拆包 即将元组内部每个元素按照位置一一对应的赋值给不同变量 注意!要赋值的变量数量必须严格等于元组内元素数量!
tuple_1 = (1, 2, 3, 4, 'sss', 'aa')
key_1, key_2, key_3, key_4, key_5, key_6 = tuple_1
元组内置方法:
集合(set)
无序;无法更改已有元素,但是可以添加新元素;无索引。与C++与java中的set集合不同!!!
集合用花括号编写。
#创建集合
thisset = {1, 2, 3} #集合无序,即输出时无法保证按照输入顺序输出。
thisset = set()
thisset = set('1234') #创建时,是按照单个字符进行创建的{'3', '1', '4', '2'}
thisset = set([1, 2, 3, 4]) #可以加list集合
thisset = set(tuple_name) #也可以加元组
thisset = set(dict_name) #只能将字典的键添加进去。
thisset = set(set_name) #可以添加set集合
#in not in 判断元素在不在集合中
xxx in thisset
xxx not in thisset
#添加元素
add() #添加一个元素
update() #添加多个元素
thisset.update(["orange", "mango", "grapes"])
#获取长度:len()方法
thisset.len()
#删除元素
remove() #元素不存在会报错,返回删除元素。
discard() #元素不存在不会报错,返回删除元素。
pop() #删除最后一个元素,但集合无序,不确定会删除哪一个!不推荐使用!
#清空集合
clear()
#删除集合
del 集合名
#合并两个集合
#union()返回一个新集合,包括两个集合中所有项目。
set1 = {"a", "b" , "c"}
set2 = {1, 2, 3}
set3 = set1.union(set2)
#update() 方法将 set2 中的项目插入 set1 中:
set1 = {"a", "b" , "c"}
set2 = {1, 2, 3}
set1.update(set2)
#注意,union与udate都排除重复项。
#两个集合求交集
thisset & otherset
#两个集合求并集(会去重)
thisset | otherset
#两个集合求差集 求的是被减集合不在减集合中的元素
thisset - otherset
#更多方法见下方表格。
字典
无序,可变,有索引
#创建
##创建空字典 字典可以嵌套。
my_dict = {}
my_dict = dict()
##花括号创建
thisdict = {
"brand": "Porsche",
"model": "911",
"year": 1963
}
##dict()函数创建
###函数内使用括号成对创建
my_dict = dict((1, 'q'), (3, 'r'))
###函数内使用关键字成对创建
# 请注意,关键字不是字符串字面量,并且不能为数字开头
# 请注意,使用了等号而不是冒号来赋值
my_dict = dict(li='111', zhang='222')
#添加键值对
###已有字典可以直接使用key向其中添加键值对。
my_dict[333] = 'shen'
###或者使用方法setdefault() 如果键存在,则插入 不生效 ,若插入未指定值,则值为None
#访问
x = thisdict["model"] #方括号中是键,返回“值”。
x = thisdict.get("model") #与以上方法返回值相同。
#更改值
thisdict["year"] = 2019
##或 update()方法 此方法利用一个字典集合更新另一个字典集合 如项果要更新的元素在原字典里存在,则把原来
# 的项覆盖,如果要更新的元素项在原字 典里不存在,则直接添加进去
thisdict.update(thisdict_2)
#遍历返回键
for x in thisdict:
print(x)
#遍历返回“值”
for x in thisdict:
print(thisdict[x])
#key()方法返回键
print(thisdict.key())
#values()方法返回“值”
for x in thisdict.values():
print(x)
#items()遍历键和值
for x, y in thisdict.items():
print(x, y)
#get()方法获取指定键对应的值
print(thisdict.get(201))
#in 可确定是否存在指定的键
if "model" in thisdict:
#确定长度
len()
#添加项目
thisdict["today"] = 2020 #若是新键则添加新元素,键已存在则更新键对应的值。
#删除元素
1. pop()#删除指定键名元素并返回其对应值 如果没有 key,返回 default 值
2. popitem() #删除字典中最后一对元素,返回一个键值对(key,value)形式,按照 LIFO(Last In First Out 后进先出法) 顺# 序规则,即最末尾的键值对。 如果字典已经为空,却调用了此方法,就报出KeyError异常。
# 3.7前删除随机元素。
3. del thisdict[”today“] #删除指定键名元素
#删除字典
del 字典名
#清空字典
字典名.clear()
#复制字典
#不可以直接赋值:dict2 = dict1 因为dict2只会是dict1的引用。
#使用copy()方法复制
mydict = thisdict.copy()
#使用dict()方法创建字典副本
mydict = dict(thisdict)
#字典可以嵌套
内置方法:
in 运算符?
range()函数,顺序和倒序生成数列有区别,顺序[],倒序[x + 1,]
set 排序规则源码? 添加进去的元组按照什么规则排序? 还能添加其他什么(元组、字典、list、set?)