python学习笔记四一列表元组字典等

•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

posted @ 2020-08-15 10:59  gemoumou  阅读(63)  评论(0编辑  收藏  举报