Python数据类型

一、int 数字类型(不可变的)

    1、用途:int 数字类型用于计算和运算

    2、常用方法:

        1)bit_length()  数字在二进制中所占的位数     

 1 i = 3
 2 i = 4
 3 print(i.bit_length())
 4 """
 5 二进制          十进制
 6 0000 0001          1
 7 0000 0010          2
 8 0000 0011          3
 9 0000 0100          4
10 """

 

二、str 字符串类型(不可变的)

    1、用途:用户少量的数据存储

    2、常用方法(字符串是不可变的,所有的字符串操作都生产一个新的字符串):

        1)根据索引查找元素

 1 s = 'python自动化运维21期'
 2 # 字符串第一个元素索引从0开始
 3 s1 = s[0] # 取第一个元素p
 4 print(s1) # 输出结果为p
 5 
 6 s2 = s[2] # 取第3个元素
 7 print(s2)  # 输出结果为t
 8 
 9 s3 = s[-1] # 取最后一个元素
10 print(s3) # 输出结果为期
11 
12 s4 = s[-2] # 取倒数第二个元素
13 print(s4) # 输出结果为1

        2)字符串切片

 1 # s[起始索引:结束索引+1:步长]
 2 s = 'python自动化运维21期'
 3 
 4 s1 = s[:6] #顾头不顾尾
 5 print(s1) # 输出结果为“python”
 6 
 7 s2 = s[6:9] 
 8 print(s2)  # 输出结果为 “自动化"
 9 
10 s3 = s[:6:2] #每隔1个元素,取一个元素    
11 print(s3) # 输出结果为"pot"
12 
13 s4 = s[:] # 获取整个字符串
14 print(s4) 
15 
16 s5 = s[-1:-5:-1]  #倒着取值,必须加反向步长
17 print(s5)    # 输出结果为 “期12维”

        3)capitalize() 首字母大写,其他字母小写*

1 s = 'oldBoy'
2 s1 = s.capitalize()
3 print(s1) # 输出结果为 "Oldboy"

        4)upper()全部大写;lower()全部小写***

 1 s = oldBoy
 2 s2 = s.upper()
 3 s3 = s.lower()
 4 print(s2,s3) #输出结果为 "OLDBOY" 和 "oldboy"
 5 
 6 # 验证码判断
 7 code = 'QeAr'.upper()
 8 your_code = input('请输入验证码:').upper()
 9 if your_code == code:
10      print('验证成功')

 

        5)swapcase() 大小写反转*

1 s = 'oldBoy'
2 s4 = s.swapcase()
3 print(s4) # 输出结果为"OLDbOY"

 

        6)title() 非字母的元素隔开的每个单词首字母大写

1 s = 'alex wusir*oldboy3taibia'
2 s5 = s.title()  
3 print(s5) # 输出结果为 "Alex Wusir*Oldboy3Taibia"

        7)center() 居中,长度自己设定,默认填充物None

1 s = 'oldBoy'
2 
3 s6 = s.center(30)
4 s6 = s.center(30,"*")
5 print(s6)

        8)startswith() 和 endswith() 判断字符数以什么字符开始或者结尾

1 s = 'oldBoy'
2 
3 s7 = s.startswith('o') # 是否以o开头,如果是返回True
4 s7 = s.startswith('ol') # 是否以ol开头,如果是返回True
5 s7 = s.startswith('oldBoy') # 是否以oldBoy开头,如果是返回True
6 s7 = s.startswith('Bo',3,5) # 从索引3到索引5,是否已Bo开头,如果是返回True
7 
8 print(s7)

        9)strip() 去除字符串首尾的空格,还包括 制表符\t  换行符\n

 1 # 用法1去掉空格
 2 s = "  oldboy  "
 3 s8 = s.strip()
 4 print(s8) # 输出结果为 "oldboy"
 5 
 6 # 用法2去掉字母
 7 s = "oldboy"
 8 
 9 s9 = s.strip('o')
10 print(s9) # 输出结果为"ldboy"
11 
12 # 迭代去除,会把o和y分别当做元素进行匹配
13 s10 = s.strip('oy')
14 print(s10) # 输出结果为"ldb"

        10)split() 字符串分割,分割后为列表类型。即为 str 转换成 list 的方法。

 1 s1 = 'oldboy wusir alex'
 2 s2 = 'oldboy,wusir,alex'
 3 s3 = 'oldboywusiroalex'
 4 
 5 # 默认以空格分割,转换成列表
 6 l1 = s1.split()
 7 print(l1)
 8 
 9 # 以逗号分割
10 l2 = s2.split(',')
11 print(l2)
12 
13 # 以字符o分割,分割后的元素比分割符数量多1
14 l3 = s3.split('o')  # ['', 'ldb', 'ywusir', 'alex']
15 print(l3)
16 
17 l4 = s3.split('o',1)  # ['', 'ldboywusiroalex']

        11)join() 用作字符串元素之间添加新的固定元素。在列表中 即为 list 转换成 str 的方法。

1 s = "oldBoy"
2 # 
3 s1 = '+'.join(s)
4 print(s1) # 输出结果为 "o+l+d+B+o+y"
5 
6 l1 = ['oldboy','wusir','alex']
7 s2 = '_'.join(l1)
8 print(s2) # 输出结果为 "oldboy_ wusir_ alex"

        12)replace() 替换字符串的内容

1 s = "我是好人,你不是好人"
2 # 替换所有好人为坏人
3 s1 = s.replace("好人", "坏人")
4 print(s1)
5 
6 # 替换第一个好人为坏人 
7 s2 = s.replace("好人", "坏人", 1)
8 print(s2)

        13)find() 通过元素找索引,找不到返回-1

 1 s = 'oldBoy'
 2 # find 通过元素找索引,找不到返回-1
 3 # index 通过元素找索引,找不到会报错
 4 
 5 ind = s.find('d')
 6 print(ind) # 输出结果为"2"
 7 
 8 ind = s.find('o')
 9 print(ind) # 输出结果为 "0"
10 
11 ind = s.find('A')
12 print(ind) # 输出结果为"-1"
13 
14 ind = s.index('A')
15 print(ind) # 报错

        14)format() 格式化输出

1 # 和字符串格式化输出类似,但format是根据索引传值,一个索引可以被调用多次。
2 res='我叫{}今年{}岁,爱好{}'.format('egon',18,'male')
3 print(res)
4 
5 res='我叫{0}今年{1}岁,爱好{2},我依然叫{0}'.format('egon',18,'male')
6 print(res)
7 
8 res='{name} {age} {sex}'.format(sex='male', name='egon', age=18)
9 print(res)

        15)公共方法:len() 和 count()

1 s = 'fdsafsdagsdafjdskahdhjlsadhfkj'
2 print(len(s)) # 输出结果为30
3 
4 s = 'fdsadd'
5 print(s.count('d')) # 输出结果为3

        16)str.isalnum() 字符串由字母或数字组成,返回结果为True或者False

        17)str.isalpha() 字符串只由字母组成,返回结果为True或者False

        18)srt.isdigit() 字符串只由数字组成,返回结果为True或者Flase

三、bool 

1 """
2 int --- > bool # 0 == False  非0 == True
3 bool ---> int  # int(True)  == 1    int(False) == 0
4 str ---> bool  # "" == False   非空字符串 == True
5 """
6 print(int(True)) # 输出结果为1
7 print(bool("")) # 输出结果为"False"

 

四、list 列表(可变的)

    1、作用:存储大量的数据

    2、方法:

        1)增

 1 # 方法1:append 在最后追加
 2 l = ['老男孩', 'alex', 'wusir', 'taibai', 'ritian']
 3 # 添加一个元素
 4 l.append('葫芦')
 5 # 添加一个列表元素
 6 l.append([1,2,3])
 7 print(l)
 8 
 9 # 方法2:insert 插入
10 # 选择索引位置插入
11 l.insert(1, "女神")
12 print(l)
13 
14 # 方法3:迭代着添加,即把列表的每个元素分别添加
15 l.extend('alex')
16 l.extend(['111',222,333])
17 print(l)

        2)删

 1 l = ['老男孩', 'alex', 'wusir', 'taibai', 'ritian']
 2 
 3 # pop 有返回值  按照索引删除
 4 l.pop(0)
 5 print(l.pop(0))
 6 print(l)
 7 
 8 #remove 按照元素删
 9 l.remove('alex')
10 print(l)
11 
12 #clear 清空列表
13 l.clear()
14 print(l)
15 
16 #del 内存级别删除列表
17 del l
18 print(l)
19 
20 #按索引删除
21 del l[1]
22 print(l)
23 
24 #切片删除
25 del l[:3]
26 print(l)

        3)改

 1 l = ['老男孩', 'alex', 'wusir', 'taibai', 'ritian']
 2 
 3 # 按照索引改
 4 print(l[2])
 5 l[2] = '武则天'
 6 print(l)
 7 
 8 # 按照切片去改
 9 l[:2] = 'abc'
10 print(l)
11 
12 l[1:3] = [111,222,333,444]
13 print(l)

        4)查

1 li = [111,'alex',222,'wusir']
2 
3 print(li[1])  # alex
4 print(li[-1])  # wusir
5 print(li[:2])  # [111, 'alex']
6 print(li[:3:2]) # [111, 222]

        5)其他方法

 1 l1 = [1,2,1,2,1,1,3,4]
 2 
 3 #count 计数
 4 print(l1.count(1))
 5 
 6 #len 计算元素长度
 7 print(len(l1))
 8 
 9 #通过元素找索引
10 print(l1.index(2))
11 
12 
13 # l2 = [3,2,4,6,9,8,7,1]
14 
15 #sort 排序
16 l2.sort()  # 从小到大排序
17 print(l2)
18 
19 l2.sort(reverse=True)  #从大到小排序
20 print(l2)
21 
22 #reverse 反转元素顺序
23 l2.reverse()
24 print(l2)

    3、列表的嵌套

 1 l1 = [1, 2, 'alfdsafex', 'wusir',['oldboy', 'ritian', 99], 'taibai']
 2 l2 = [1, 2, 'alfdsafex', 'wusir',['oldboy', 'ritian', 10], 'taibai']
 3 
 4 # 1,将'alex'全部变成大写,放回原处。
 5 # 方法1
 6 l1[2] = 'ALEX'
 7 # 方法2
 8 l1[2] = l1[2].upper()
 9 print(l1)
10 
11 # 2,给['oldboy', 'ritian', 99] 追加一个元素‘女神’。 一个方法
12 l1[-2].append('女神')
13 print(l1)
14 
15 # 3,将'ritian'首字母大写,放回原处。
16 l1[-2][1] = l1[-2][1].capitalize()
17 print(l1)
18 
19 # 4,将99通过数字相加,或者字符串相加或者等等,变成'100'
20 l1[-2][-1] = str(l1[-2][-1] + 1)
21 print(l1)
22 
23 l2[-2][-1] = str(l1[-2][-1]) + '0'
24 print(l2)

 

五、tuple 元组(不可变的)

    1、作用:只读列表,存储不可变的数据

    2、方法(只有查询方法):

 1 tu = (11,2,True,[2,3,4],'alex')
 2 # 遍历元组,打印每个元素
 3 for i in tu:
 4     print(i)
 5 # 根据索引查元素
 6 print(tu[1])
 7 # 根据切边查元素
 8 print(tu[:3:2])
 9 # 根据元素查索引
10 print(tu.index(True))
11 # 统计元素的出现的个数
12 print(tu.count(2))
13 # 计算元素的长度
14 print(len(tu))
15 # 修改元素为列表的元素
16 tu[-2].append(666)
17 print(tu)

六、dict 字典

      1、作用:存储大量的数据关系型数据。查询速度非常快,符合二分查找法,比如:字典里面与200个key,最多8次即可查询出结果 即 2**8 = 256。

'''
字典的key是唯一的。key 必须是不可变的数据类型。
    key:不可变的数据类型(可哈希):str,bool,tuple,int。
    value:任意数据类型。
        数据类型分类:
            不可变的数据类型(可哈希):str,bool,tuple,int
            可变的数据类型:dict,list,set。
            容器类数据类型:list,tuple,dict,set.
字典:存储数据多,关系型数据,查询速度快(二分查找)。
3.6版本之前,字典是无序的,3.6之后字典是有序的。
'''

      2、方法:

 1 dic = {'name': 'taibai', 'age': 21, 'hobby': 'girl', }
 2 
 3 # 增加方法1:
 4  # dic['high'] 增加key,有则覆盖,无则添加
 5 dic['high'] = 180
 6 dic['name'] = 'ritian'
 7  print(dic)
 8 
 9 # 增加方法2:
10 # dic.setdefault()  有则不变,无则添加
11 dic.setdefault('high')
12 dic.setdefault('high',180)
13 dic.setdefault('name','日天')
14 print(dic)
字典增加
 1 dic = {'name': 'taibai', 'age': 21, 'hobby': 'girl', }
 2 
 3 # pop删除有返回值 返回对应的值
 4 print(dic.pop('name'))  
 5 # 自定义返回值
 6 print(dic.pop('name1','没有此key sb')) 
 7 print(dic)
 8 
 9 # clear清空字典
10 dic.clear() 
11 print(dic)
12 
13 # popitem随机删除,有返回值,以元组的方式 返回被删除的key、value
14 print(dic.popitem()) 
15 print(dic)
16 
17 #  del从内存中删除字典 
18 del dic
19 print(dic)
20 
21 # del 删除指定的元素
22 del dic['age']
23 print(dic)
字典删除
 1 dic = {'name': 'taibai', 'age': 21, 'hobby': 'girl', }
 2 # 根据key修改value
 3 dic['name'] = '老男孩'
 4 print(dic)
 5 
 6 # update更新字典 将dic的键值对覆盖添加到dic2中,dic不变。
 7 dic = {"name":"jin","age":18,"sex":"male"}
 8 dic2 = {"name":"alex","weight":75}
 9 dic2.update(dic)  
10 print(dic)
11 print(dic2)
字典修改
 1 dic = {'name': 'taibai', 'age': 21, 'hobby': 'girl', }
 2 
 3 # 根据key查找value,如果没有对应的key则报错
 4 print(dic['name2'])
 5 
 6 # get 查找元素,如果没有则返回None
 7 print(dic.get('name'))
 8 print(dic.get('name1'))
 9 # get 可以自定义返回值
10 print(dic.get('name1','没有此key'))
11 
12 # keys()  获取字典的所有key
13 print(list(dic.keys()))
14 for i in dic.keys():
15     print(i)
16 
17 # values() 获取字典的所有 value
18 print(dic.values())
19 for i in dic.values():
20     print(i)
21 
22 # items() 获取元素的key和value 以元组的方式返回
23 print(list(dic.items()))
24 for i in dic.items():
25     print(i)
字典查询
 1 # 分别赋值
 2 a,b = 1,2
 3 a,b,c = ['alex', 'wusir', 'ritain']
 4 print(a,b,c)
 5 
 6 a = 1
 7 b = 5
 8 a,b = b,a
 9 print(a,b)
10 
11 dic = {'name': 'taibai', 'age': 21, 'hobby': 'girl', }
12 for k,v in dic.items():
13     print(k,v)
14 
15 # len 获取字典的长度
16 print(len(dic))
字典分别赋值
 1 dic = {
 2     'name_list':['b哥', '张帝', '人帅', 'kitty'],
 3     '老男孩':{
 4         'name':'老男孩',
 5         'age': 46,
 6         'sex': 'ladyboy',
 7     },
 8 }
 9 #1,['b哥', '张帝', '人帅', 'kitty']追加一个元素,'骑兵'
10 dic['name_list'].append('骑兵')
11 print(dic)
12 
13 #2,将kitty全部变成大写。
14 dic['name_list'][-1] = dic['name_list'][-1].upper()
15 print(dic)
16 
17 #3,将老男孩 改成oldboy。
18 dic['老男孩']['name'] = 'oldboy'
19 print(dic)
20 
21 #4,将ladyboy首字母大写。
22 dic['老男孩']['sex'] = dic['老男孩']['sex'].capitalize()
23 print(dic)
字典的嵌套
 1 # fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
 2 
 3 dic1 = dict.fromkeys('abc','张三') 
 4 dic2= dict.fromkeys([1,2,3],'李四') 
 5 print(dic1) #{'a': '张三', 'b': '张三', 'c': '张三'}
 6 print(dic2) # {1: '李四', 2: '李四', 3: '李四'}
 7 
 8 dic3 = dict.fromkeys('abc',[])
 9 print(dic3) # {'a': [], 'b': [], 'c': []}
10 
11 dic3['a'].append('老男孩') 
12 print(dic3) # {'a': ['老男孩'], 'b': ['老男孩'], 'c': ['老男孩']}
fromkeys()

七、set 集合

    1、作用:数据的去重和数据的关系测试

'''
集合:
    无序,不重复的数据类型。它里面的元素必须是可哈希的。但是集合本身是不可哈希的。
    1,关系测试。交集并集,子集,差集....
    2,去重。(列表的去重)
'''

    2、方法

1 # 集合元素必须是可哈希的数据类型,即不可变的数据类型
2 set1 = {1,'alex',False,(1,2,3)}
3 
4 # 列表去重,先把列表转换成集合,集合会自动去重
5 l1 = [1,1,2,2,3,3,4,5,6,6]
6 l2 = list(set(l1))
7 print(l2)
去重
1 set1 = {'alex','wusir','ritian','egon','barry'}
2 # add 增加
3 set1.add('666')
4 print(set1) # {'barry', 'wusir', 'egon', '666', 'alex', 'ritian'}
5 
6 # update迭代增加
7 set1.update('abc') 
8 print(set1) # {'barry', 'wusir', 'egon', 'c', '666', 'alex', 'b', 'a', 'ritian'}
增加元素
set1 = {'alex','wusir','ritian','egon','barry'}

# remove删除一个元素
set1.remove('alex')  
print(set1)

# pop 随机删除一个元素,并发有返回值,返回被删除是元素
set1.pop()  
print(set1)

# 清空集合
set1.clear()  
print(set1)

# 从内存中删除集合
del set1  
print(set1)
删除元素
1 set1 = {1,2,3,4,5}
2 set2 = {4,5,6,7,8}
3 
4 print(set1 & set2) # {4, 5}
5 print(set1.intersection(set2)) # {4, 5}
交集:&或者intersectio
1 set1 = {1,2,3,4,5}
2 set2 = {4,5,6,7,8}
3 
4 print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8}
5 print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8}
并集:|或者union
1 set1 = {1,2,3,4,5}
2 set2 = {4,5,6,7,8}
3 
4 print(set1 - set2) # {1, 2, 3}
5 print(set1.difference(set2)) # {1, 2, 3}
差集:-或者difference
1 set1 = {1,2,3,4,5}
2 set2 = {4,5,6,7,8}
3 
4 print(set1 ^ set2) # {1, 2, 3, 6, 7, 8}
5 print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}
反交集:^或者symmetric_difference
1 set1 = {1,2,3}
2 set2 = {1,2,3,4,5,6}
3 
4 print(set1 < set2)  # 返回True 说明set1是set2子集。
5 print(set1.issubset(set2))  # 返回True 说明set1是set2子集。
6 
7 print(set2 > set1)  # 返回True 说明set2是set1超集。
8 print(set2.issuperset(set1)) # 返回True 说明set2是set1超集。
子集和超集
 1 # 创建不可变集合
 2 s = frozenset('barry')
 3 s1 = frozenset({4,5,6,7,8})
 4 
 5 print(s,type(s)) # frozenset({'r', 'b', 'y', 'a'}) <class 'frozenset'>
 6 print(s1,type(s1)) # frozenset({4, 5, 6, 7, 8}) <class 'frozenset'>
 7 
 8 
 9 # set(可变集合)与frozenset(不可变集合)的区别:
10 
11 # 1、set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算. 
12 set 支持 x in set, len(set),和 for x in set。作为一个无序的集合,set不记录元素位置或者插入点。因此,sets不支持 indexing, 或其它类序列的操作。
13 
14 # 2、frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法
frozenset()不可变集合

八、编码转换二

编码:
    ascii:字母,数字,特殊字符。
    万国码:unicode
            A:0000 0010 0000 0010 两个字节,表示一个字符。
            中:0000 0010 0000 0010 两个字节,表示一个字符。
    升级:
            A:0000 0010 0000 0010 0000 0010 0000 0010 四个字节,表示一个字符。
            中: 0000 0010 0000 0010 0000 0010 0000 0010 四个字节,表示一个字符。
            缺点:占空间,浪费资源。
    utf-8:最少用一个字节,表示一个字符.
            A: 0000 0010    (字母占用1个字节)
            欧洲:0000 0010 0000 0010  (欧洲占用2个字节)
            中文:0000 0010 0000 0010 0000 0010  (中文占用3个字节)
    gbk国标:
            A: 0000 0010  (字母占用1个字节)
            中: 0000 0010 0000 0010 (中文占用2个字节)
    python3x:
            1,不同编码之间的二进制是不能互相识别的。
            2,python3x str内部编码方式(内存)为unicode。但是,对于文件的存储,和传输不能用unicode
            3,bytes类型:内部编码方式(内存)为非unicode
            #对于英文
                str:
                s = 'laonanhai' 表现形式
                内部编码方式 unicode

                bytes:
                s1 = b'laonanhai'  表现形式
                内部编码方式 非unicode (utf-8,gbk,gb2312....)
            #对于中文:
                str:
                    s = '中国'
                    print(s,type(s))
                bytes:
                    s1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
                    print(s1,type(s1))
编码

九、数据类型补充

 

    1、再循环一个列表时,不要对列表进行删除的动作(改变列表元素的个数动作),会出错因为删除以后索引发生变化

l1 = ['alex', 'wusir', 'taibai', 'barry', '老男孩']
del l1[1::2]


for i in range(len(l1)):
    print(l1)  # ['alex', 'wusir', 'taibai', 'barry', '老男孩']
                # ['alex', 'wusir', 'taibai', 'barry', '老男孩']
                # ['alex', 'taibai', 'barry', '老男孩']
                 # ['alex', 'taibai', 'barry', '老男孩']
    print(i) # 0 1  2  3
    if i % 2 == 1:
        del l1[i]
    print(l1) # ['alex', 'wusir', 'taibai', 'barry', '老男孩']
             # ['alex', 'taibai', 'barry', '老男孩']
            # ['alex', 'taibai', 'barry']
    print(i) # 0 1
# 再循环一个列表时,不要对列表进行删除的动作(改变列表元素的个数动作),会出错
列表补充

    2、dict 再循环字典时,不要改变字典的大小。

# dict 删除以"k"开头的key
dic = {'k1':'v1','k2':'v2','k3':'v3','r':666}

# 错误写法:
for i in dic.keys():
    if "k" in i:
        dic.pop(i)
# RuntimeError: dictionary changed size during iteration

# 正确写法
# 把包含k的key添加到列表里
l1 = []
for i in dic:
    if 'k' in i:
        l1.append(i)
# 删除key
for i in l1:
    del dic[i]
print(dic)
字典补充

    3、如果元组里面只有一个元素并且没有逗号隔开,那么他的数据类型与该元素一致。

# tu 如果元组里面只有一个元素并且没有逗号隔开,那么他的数据类型与该元素一致。
tu1 = (1)
print(tu1,type(tu1)) # 1 <class 'int'>

tu2 = ('alex')
print(tu2,type(tu2)) # alex <class 'str'>

tu3 = (['alex',1,2])
print(tu3,type(tu3)) # ['alex', 1, 2] <class 'list'>
元组补充

    4、小数据池

#id == is
a = 'alex'
b = 'alex'
print(a == b)  # 比较数值
print(a is b)  # 比较内存地址
print(id(a))

# python中 有小数据池的概念。
# int -5 ~256 的相同的数全都指向一个内存地址,节省空间。
# str:s = 'a' * 20 以内都是同一个内存地址
#     只要字符串含有非字母元素,那就不是一个内存地址

    5、深浅copy

#深浅copy
#赋值运算,它们共用一个列表
import copy
a = [1,2,3]
b = a
a.append(666)
print(a,b)

#浅copy
l1 = [1,2,3]
l2 = l1.copy()
l1.append(666)
print(l1,l2)
print(id(l1),id(l2))

l1 = [1,2,3,[22,33]]
l2 = l1.copy()
l1[-1].append(666)
print(l1,l2)
print(id(l1[-1]),id(l2[-1]))

#对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,
# 指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性

#深copy 对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
# import copy
l1 = [1,2,3,[22,33]]
l2 = copy.deepcopy(l1)
l1[-1].append(666)
print(l1,l2)
print(id(l1[-1]),id(l2[-1]))

十、作业(购物车)

#!/usr/bin/env python3
import os
import time
# day2 博客地址:http://www.cnblogs.com/spf21/p/8734989.html
"""
购物车需求:
1、用户登录以后才可以购买商品
2、用户登录失败3次则被锁定
3、用户第一次登录需要充值金额,第二次登录显示可用余额
4、打印商品列表,让用户根据序号选择商品,加入购物车
5、购买商品,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。
6、用户退出以后打印购物车
7、用户登录可以查购物历史
8、用户约不足的时候可以充值余额
注释:  用户信息存在user_file文件里面  
       被锁定用户存在user_lock_file文件里面
       用户余额存在%user_money
       用户购买历史存在%user_his
测试用户  密码
wxx      123   
spf      123   
allen    123   
"""


def recharge(first, user, second=0):
    # 充值函数
    open_file = open("./file/%s_money" % (user,), mode="w")
    open_file.write(str(first + second))
    open_file.close()
    total_money = first + second
    return total_money


def check_money(user):
    # 查看余额函数
    open_file = open("./file/%s_money" % (user,), mode="r")
    balance = open_file.read()
    open_file.close()
    balance = int(balance)
    return balance


goods = [{"name": "电脑", "price": 1999},
         {"name": "鼠标", "price": 10},
         {"name": "游艇", "price": 20},
         {"name": "美女", "price": 998}]

# fail_user 存登录失败用户
fail_user = []
# 最外层循环标志位
flag = True

print("".center(35, "="))
print("\033[0;34;0m<欢迎访问SPF商城>\033[0m".rjust(32, " "))
print("".center(35, "="))
print("\033[0;31;0m<请先登录,登录后才可以购买商品!>\033[0m")

# 购物车start
while flag:
    # 用户登录循环标志位
    flag_login = False
    # 检测用户是否被锁定标志位
    flag_check_lock = False
    # 输入用户名和密码
    username = input(">>>请输入用户名:").strip()
    password = input(">>>请输入密码:").strip()
    # 判断用户名或密码不能为空
    if not username or not password:
        print("\033[0;31;0m用户名或者密码不能为空\033[0m")
        continue
    # 判断用户是否被锁定
    user_lock_file = open("./file/user_lock_file", mode="r")
    for i in user_lock_file.readlines():
        _username, = i.split()
        if _username == username:
            print("\033[0;31;0m用户已经被锁定!请联系管理员解锁!\033[0m")
            flag_check_lock = True
    user_lock_file.close()

    # 用户已经被锁定,则返回登录界面
    if flag_check_lock == True:continue

    # 判断用户密码是否正确
    user_file = open("./file/user_file", mode="r")
    for i in user_file.readlines():
        _username, _password = i.split()
        if username == _username and password == _password:
            print("-"*25)
            print("\033[0;33;0m登录成功!欢迎:\033[0;33;0m<%s>\033[0m\033[0m" % (username,))
            flag_login = True

            # 检查用户是否充值过金额,如果没有则充值金额
            # 如果用户没有充值过,则充值金额
            if os.path.exists("./file/%s_money" % (username,)) != True:
                while True:
                    money = input(">>>请充值金额:").strip()
                    if money.isdigit():
                        money = int(money)
                        recharge(money, username)
                        break
                    else:
                        print("\033[0;31;0m请输入正确的金额!\033[0m")
                        continue
            # 如果用户充值过,则显示用户余额
            else:
                money = check_money(username)
                print("-" * 24)
                print("")
                print("\033[0;35;0m你的账户余额:%d $\033[0m" % (money,))
            # 开始购物
            while flag:
                # 打印商品列表
                print("\033[0;33;0m商品列表\033[0m".center(35, "-"))
                print("")
                print("\033[0;31;0m商品ID   商品名称    商品价格\033[0m")
                for j in goods:
                    print("\033[0;33;0m%d        %s       %d$\033[0m" % (goods.index(j), j["name"], j["price"]))
                print("")
                print("-" * 25)
                buy = input(">>>请输入你要购买的商品名ID(\033[0;31;0mq退出/h查看购物车/s查看余额\033[0m):").strip()
                # 购买商品
                if buy.isdigit():
                    buy = int(buy)
                    # 判断用户输入的商品编号是否存在
                    if buy > (len(goods) - 1):
                        print("\033[0;31;0m你输入的商品ID不存在!\033[0m")
                        continue
                    # 选择购买数量
                    choice_number = input(">>>请选择购买的数量:")
                    if choice_number.isdigit():
                        choice_number = int(choice_number)
                        # 判断余额是否充足
                        if (goods[buy]["price"] * int(choice_number)) < money:
                            print("-"*25)
                            print("\033[0;36;0m你已经成功添加%s个<%s>到购物车!\033[0m" % (choice_number, goods[buy]["name"]))
                            # 保存购物车
                            count = 1
                            while count <= int(choice_number):
                                date = time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())
                                user_his = open("./file/%s_his" % (username,), mode="a")
                                user_his.write("%s  %s\n" % (goods[buy]["name"], date))
                                user_his.close()
                                count += 1
                            # 保存余额
                            money = money - (goods[buy]["price"] * int(choice_number))
                            money_file = open("./file/%s_money" % (username,), mode="w")
                            money_file.write(str(money))
                            money_file.close()
                        else:
                            choice = input("\033[0;31;0m>>>余额不足!是否进行充值Y/N:\033[0m").strip()
                            # 充值
                            if choice == "y" or choice == "Y":
                                recharge_money = input(">>>请充值金额:").strip()
                                if recharge_money.isdigit():
                                    recharge_money = int(recharge_money)
                                    money = recharge(money, username, recharge_money)
                                    continue
                                else:
                                    print("\033[0;31;0m请输入正确的金额!\033[0m")
                                    continue
                            elif choice == "N" or choice == "n":
                                continue
                            else:
                                print("-"*25)
                                print("\033[0;31;0m请输入正确的指令!\033[0m")
                    else:
                        print("\033[0;31;0m请输入正确的数量!\033[0m")
                elif buy == "Q" or buy == "q":
                    print("\033[0;33;0m Bye Bye!!!\033[0m")
                    flag = False
                # 查看购物车
                elif buy == "h" or buy == "H":
                    if os.path.exists("./file/%s_his" % (username,)) == True:
                        buy_his = open("./file/%s_his" % (username,), mode="r")
                        print("-" * 35)
                        print("\033[0;33;0m购物车:\033[0m")
                        count_i = 1
                        for his in buy_his.readlines():
                            shop, d = his.split()
                            print("\033[0;33;0m%s.%s 购买时间:%s\033[0m" % (count_i, shop, d))
                            count_i += 1
                    else:
                        print("\033[0;33;0m你还未购买任何商品!\033[0m")
                # 查看账户余额
                elif buy == "s" or buy == "S":
                    money = check_money(username)
                    print("-" * 24)
                    print("\033[0;35;0m你的账户余额:%s$\033[0m" % (money,))
                else:
                    print("-"*25)
                    print("\033[0;31;0m请输入正确指令!\033[0m")
    user_file.close()
    # 用户登录失败操作
    if flag_login == False:
        print("\033[0;31;0m登录失败!用户名或者密码错误!\033[0m")
        # 如果用户连续输入错误超过3次,则锁定用户
        fail_user.append(username)
        if fail_user.count(username) == 3:
            print("\033[0;31;0m用户<%s>连续输入错误超过3次,用户将被锁定!\033[0m" % (username,))
            user_lock_file = open("./file/user_lock_file", mode="a")
            user_lock_file.write(username+"\n")
            user_lock_file.close()
购物车
./file/user_info
spf 123
wxx 123
allen 123
zmm 123
xuxu  123

./file/user_lock_file
allen
购物车密码文件和锁文件

 

 

 

   

posted @ 2018-04-08 18:24  S.Curry  阅读(365)  评论(0编辑  收藏  举报