•python中的内置类型◾str
◾list
◾tuple
◾set
◾dict
•list 列表
•一组由有序数据组成的序列◾数据有先后数据
◾数据可以不是一类数据
•list 的创建◾直接创建,用中括号创建,内容使用因为逗号 , 隔开
◾使用list创建
◾列表包含单个字符串的时候是一个特例
#直接赋值创建列表
l1 = [1,2,3,4,5]
#list内的数据可以不是一个类型
l2 = [1,2,3,"gepengcheng","杨雨"]
print (l1)
print (l2)
[1, 2, 3, 4, 5]
[1, 2, 3, ‘gepengcheng’, ‘杨雨’]
#创建列表的第二种方式
l3 = list ()
print (l3)
#现实创建l3是什么类型函数
print (type (l3))
[]
<class ‘list’>
内置函数
•help ;帮助函数
•type : 现实变量的类型
•id :现实变量id
•print : 打印
# list 创建的特例
s = "gepengcheng"
#想创建一个只含s只包含一个字符串的列表
l1 = list(s)
print (type (l1))
print (l1)
<class ‘list’>
[‘g’, ‘e’, ‘p’, ‘e’, ‘n’, ‘g’, ‘c’, ‘h’, ‘e’, ‘n’, ‘g’]
列表的常见操作
•访问◾使用下标操作,也叫索引
◾列表的元素索引从0开始
•切片操作◾对列表进行任意一段的截取需要注意取值范围,左包括右不包括
◾截取之后创建一个新得列表
l1 = [12,13,11,22,345,33]
#使用下标访问
print(l1[0])
print (l1[3])
#IndexError访问超标
print (l1[15])
12
22
IndexError Traceback (most recent call last)
in
4 print (l1[3])
5 #IndexError访问超标
----> 6 print (l1[15])
IndexError: list index out of range
#切片操作需要注意取值范围,元素索引从0开始左包括右不包括
l1 = [100,200,300,400,500,600,700,800,900]
print (l1[3:6])
#切片操作下标可以为空
print (l1[:6])
print (l1[3:])
print (l1[:])
print("__________________________________")#分隔符
#下面结果说明切片后生成一个全新的列表
#通过内置函数id可以判断出切片是否生成了一个全新的列表
#id 的作用是用来判断两个变量是否是一个变量
l2 = l1[0:10]
print (id(l1))
print (id(l2))
[400, 500, 600]
[100, 200, 300, 400, 500, 600]
[400, 500, 600, 700, 800, 900]
[100, 200, 300, 400, 500, 600, 700, 800, 900]
2546774356808
2546755019528
#切片可以控制增长的幅度,默认增长幅度为1
l1 = [100,200,300,400,500,600,700,800,900,1000]
print (l1[::1])#等于print (l1[:])
print (l1[::2])
print("__________________________________")#分隔符
#下标可以超出范围,超出后不在考虑多余的下标内容
print (l1[:100])
print (l1[100:])
[100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]
[100, 300, 500, 700, 900]
[100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]
[]
#下标从左往右数从0开始如 0,1,2,3,....
#下标从右往左数从-1开始如 -1,-2,-3,-4....
l1 = [100,200,300,400,500,600,700,800,900,1000]
#下面例子为空,因为默认是从左向右移动
print (l1[-2:-5])
#如果我想从右往左开始 打印900,800,700则:
print (l1[-2:-5:-1])
#如果我想从右往左开始 打印700,800,900则;
print (l1[-4:-1:1])
[]
[900, 800, 700]
[700, 800, 900]
tuple (元组)
•可以理解成一个不允许更改的列表
tuple (元组)
•可以理解成一个不允许更改的列表
#tuple 创建
# 1,直接用小括号创建
a = ()
print (type(a))
#用小括号创建一个元素的tuple的时候
b = (100)
print (type(b))
c = (100,)
print (type(c))
d = (1,2,3,4)
print (d)
print (type(d))
print ("___________________________________________")#分隔符
# 2,直接用逗号
a1 = 100,
print (type(a1))
b1 = (1,2,3,4)
print (type(b1))
print ("___________________________________________")#分隔符
a2 = tuple ()
print (a2)
b1 = [1,2,3,"gepengcheng"]#要求tuple参数必须可迭代
c1 = tuple (b1)
print (c1)
<class ‘tuple’>
<class ‘int’>
<class ‘tuple’>
(1, 2, 3, 4)
<class ‘tuple’>
<class ‘tuple’>
<class ‘tuple’>
()
(1, 2, 3, ‘gepengcheng’)
tuple 其余特征和list基本一致
•有序
•可以访问不可以更改
•元素可以是任意类型
# tuple索引操作
a3 = ["i","love","una"]
print (a3)
b3 = tuple (a3)
print (b3[2])
[‘i’, ‘love’, ‘una’]
una
# tuple 分片操作
print (b3[:])
print (b3[:2])
print (b3[-1::-1])
(‘i’, ‘love’, ‘una’)
(‘i’, ‘love’)
(‘una’, ‘love’, ‘i’)
# 元组的相加
ta = 100,200,300
tb = ("i","love","una")
tc = ta + tb
print (tc)
(100, 200, 300, ‘i’, ‘love’, ‘una’)
#tuple 乘法
aa = a3 * 2
print (aa)
[‘i’, ‘love’, ‘una’, ‘i’, ‘love’, ‘una’]
# tuple 成员检测
print (a3)
if "una" in a3:
print ("检测到una")
if "yangyu" not in a3:
print ("未检测到yangyu")
if "una" not in a3:
print ("未检测到una")
[‘i’, ‘love’, ‘una’]
检测到una
未检测到yangyu
# 元组遍历(把一段字符拆开)
love = ["i","love","una"]
for i in love:
print (i)
i
love
una
# 元组嵌套
a4 = ((100,200,300),("i","love","una"),(520,13,14))
#双层循环
for A in a4:
print (A)
for B in A:
print (B)
(100, 200, 300)
100
200
300
(‘i’, ‘love’, ‘una’)
i
love
una
(520, 13, 14)
520
13
14
#使用单层循环
b4 = ((100,200,300),("i","love","una"),(520,13,14))
for i,l,u in b4:
print (i,l,u)
print ("____________________________________")#分隔符
# 上面访问中有一个规定,既i,l,u要跟元组个数进行对应
for i,l,u,y in b4:
print (i,l,u,y)
100 200 300
i love una
520 13 14
ValueError Traceback (most recent call last)
in
6 print ("____________________________________")#分隔符
7 # 上面访问中有一个规定,既i,l,u要跟元组个数进行对应
----> 8 for i,l,u,y in b4:
9 print (i,l,u,y)
10
ValueError: not enough values to unpack (expected 4, got 3)
#常用元组函数
# len : 长度
c4 = ((100,200,300),("i","love","una"),(520,13,14))
print(len(c4))
print ("____________________________________")#分隔符
# max/min : 最大值/最小值
d4 = (12,342,31312,212)
print (max(d4))
print (min(d4))
print ("____________________________________")#分隔符
# count : 对某一元素进行计数
f4 = (1,2,3,4,5,1,1,1,1,1)
print (f4.count(1))
print ("____________________________________")#分隔符
# index : 某一元素所在位置
e4 = (1,2,3,4,5,1,1,1,1,1)
print(e4.index(5))
3
31312
12
6
4
# tuple的特殊用法
a = 520
b = "yang yu"
print (a,b)
print ("____________________________________")#分隔符
#要求对a,b值进行互换
a,b = b,a
print (a,b)
520 yang yu
yang yu 520
集合
•跟数学中集合得概念一致
•内容无序+内容不重复
# 集合的定义
# 1,通过set关键字
aa = set ()
print (aa)
set()
#集合定义最多只能定义1个参数
bb = set (1,2,3,4,5,6)
print (bb)
TypeError Traceback (most recent call last)
in
1 #集合定义最多只能定义1个参数
----> 2 bb = set (1)
3 print (bb)
TypeError: ‘int’ object is not iterable
b = [1,2,3,4,5,6,7]
bbb = set (b)
print (bbb)
{1, 2, 3, 4, 5, 6, 7}
# 2 ,使用大括号定义
sc = {1,2,3,4,5,6,7,8,11,22,33}
print (sc)
{1, 2, 3, 4, 5, 6, 7, 8, 33, 11, 22}
# in 操作
if 2 in sc:
print ("2在sc里面")
if 9 in sc:
print ("9在sc里面")
print ("____________________________________")#分隔符
#集合里面的顺序是无序的
for i in sc:
print (i)
2在sc里面
1
2
3
4
5
6
7
8
33
11
22
# 集合的另一种遍历
sb = {(1,2,3),(4,5,6),("i","love","una")}
for a,b,c in sb:
print (a,b,c)
i love una
4 5 6
1 2 3
# 集合的生成式
sa = {1,2,3,4,5,6,7,8,9}
# 利用sa 生成一个sb
sb = {a for a in sa}
print (sb)
print ("____________________________________")#分隔符
sc = {a for a in sa if a %2 == 0}
print (sc)
print ("____________________________________")#分隔符
sd = {a for a in sa if a %2 == 1}
print (sd)
print ("____________________________________")#分隔符
#双重for循环
#把 sa 中的每一个元素的平方生成一个新的集合
# 1,用1个for
sb = {i ** 2 for i in sa}
print (sb)
print ("____________________________________")#分隔符
# 2,用2个for循环
se = {m*n for m in sa for n in sa}
print (se)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{8, 2, 4, 6}
{1, 3, 5, 7, 9}
{64, 1, 4, 36, 9, 16, 49, 81, 25}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81}
# 集合的内置函数
# len: 长度
print (len (se))
# max/min : 最大值/最小值
#add : 向集合中添加元素
sa = {1,2,3,4,5,6,5,4,3,2,1}
print (sa)
# 向sa中添加数字7 结果打印出来None
print (sa.add(7))
#添加了值并不会在add添加选项中打印出来 如下列
print (sa)
print (sa.add(8))
print (sa)
36
{1, 2, 3, 4, 5, 6}
None
{1, 2, 3, 4, 5, 6, 7}
None
{1, 2, 3, 4, 5, 6, 7, 8}
# clear : 清空
#删除操作
# remove 与 discard的区别
#remove案例
sa1 = {1,2,3,4,5,6,7,8,9}
print (sa1)
sa1.remove(5)
print (sa1)
print ("____________________________________")#分隔符
#如果remove删除的值并不在集合中就会报错
sa1.remove(5)
print (sa1)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 6, 7, 8, 9}
KeyError Traceback (most recent call last)
in
8 print ("____________________________________")#分隔符
9 #如果remove删除的值并不在集合中就会报错
—> 10 sa1.remove(5)
11 print (sa1)
KeyError: 5
# discard案例
sa1 = {1,2,3,4,5,6,7,8,9}
print (sa1)
sa1.discard(5)
print (sa1)
print ("____________________________________")#分隔符
#如果discard删除的值就不会报错
sa1.discard(5)
print (sa1)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 6, 7, 8, 9}
{1, 2, 3, 4, 6, 7, 8, 9}
# pop删除集合的一个内容
#删除的内容是随机的
sa1 = {1,2,3,4,5,6,7,8,9}
print (sa1)
sa1.pop()
print (sa1)
sa1.pop()
print (sa1)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{2, 3, 4, 5, 6, 7, 8, 9}
{3, 4, 5, 6, 7, 8, 9}
# 集合的数学操作
# intersection : 交集
sa = {1,2,3,4,5,6}
sb = {4,5,6,7,8,9,}
#sa 和 sb 的交集
print(sa.intersection(sb))
# difference : 差集
print (sa.difference (sb))
#差集的另外一表示
print (sa - sb)
# union : 并集
print (sa.union(sb))
#并集 不能使用+表示
print (sa + sb)
{4, 5, 6}
{1, 2, 3}
{1, 2, 3}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
TypeError Traceback (most recent call last)
in
13 print (sa.union(sb))
14 #并集 不能使用+表示
—> 15 print (sa + sb)
TypeError: unsupported operand type(s) for +: ‘set’ and ‘set’
frozenset 冰冻集合¶
•不允许修改的集合
# 案例
print(sa)
sb = frozenset (sa)
print (sb)
{1, 2, 3, 4, 5, 6}
frozenset({1, 2, 3, 4, 5, 6})
递归函数¶
•递归 : 函数间接或者直接调用自己
•递归分两个过程◾往下调用,分解过程
◾往上回溯,综合过程
•递归需要注意◾一定要有结束条件
•是以资源换取编写速度的算法比较吃硬件
def a (n):
print ("i love una ")
def b (n):
a(100)
print ("una love gpc")
b(100)
i love una
una love gpc
# func_a表示己算阶乘
#利用数学公式
def fun_a(n):
print (n)
#递归一定要有结束条件
if n == 1:
return 1
return n * fun_a(n-1)
rst = fun_a(5)
print ("f(5) = ",rst)
5
4
3
2
1
f(5) = 120
递归必须有结束,负责会死掉报错¶
•def fun_a(n):
•print (n)
•return n * fun_a(n-1)
•rst = fun_a(5)
•print ("f(5) = ",rst)
# 斐波那契额数列
#1,1,2,3,5,8,13,21 前两个数列相加
def fib (n):
if n ==1 or n ==2:
return 1
return fib(n-1) + fib(n-2)
jieguo = fib (10)
print ("jieguo=",jieguo)
jieguo= 55
# 汉诺塔
a = "A"
b = "B"
c = "C"
def hannuo(a,b,c,n):
if n == 1:
print ("{}-->{}".format(a,c))
return None
if n == 2:
print ("{}-->{}".format(a,c))
print ("{}-->{}".format(a,b))
print ("{}-->{}".format(b,c))
return None
hannuo(a,c,b,n-1)
print ("{}-->{}".format(a,c))
hannuo(b,a,c,n-1)
# 只有一个盘子
hannuo(a,b,c,1)
A–>C
hannuo (a,b,c,5)
A–>B
A–>C
C–>B
A–>C
B–>C
B–>A
A–>C
A–>B
C–>A
C–>B
B–>A
C–>B
A–>B
A–>C
C–>B
A–>C
B–>C
B–>A
A–>C
B–>A
C–>A
C–>B
B–>A
B–>C
A–>B
A–>C
C–>B
A–>C
B–>C
B–>A
A–>C