Python学习笔记——day2

Python day2

标签: python


[TOC]

1.列表、元组操作

1)列表的基本使用

列表是我们最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作

names = ["zhangsan","lisi","wangwu","taoliu","qiqi","jiujiu"]
print(names[0:-1:2])    #从0到-1,隔2个字符打印1次
print(names[::2])       #0到-1,可以省略
names = ["zhangsan","lisi","wangwu","taoliu"]

#1)查
##方法一:
print(names[1:3])   #从左往右        0  1  2  3…
print(names[3])
print(names[-3:-1]) #从右往左        0  -3  -2  -1
print(names[-3:])
print(names[-1:])
#1:3    1-3 不包括3
#-3:    冒号前面、后面的“0 和 - 1”都可以省略

#输出结果:
['lisi', 'wangwu']
taoliu
['lisi', 'wangwu']
['lisi', 'wangwu', 'taoliu']
['taoliu']


方法二:
print(names.index("lisi"))      #查找字符串的下标位置
print(names[names.index("lisi")])

#输出结果:
1
lisi


#2)增
names.append("qiqi")        #末尾追加字符串
print(names)
names.insert(1,"emmm")      #插入字符串到下标为“ 1 ”的字符串前
print(names)

#输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu', 'qiqi']
['zhangsan', 'emmm', 'lisi', 'wangwu', 'taoliu', 'qiqi']


#3)修改(替换)
names[2] = "xiedi"
print(names)

#输出结果:
['zhangsan', 'lisi', 'xiedi', 'taoliu']


#4)删除
print(names)

names.remove("lisi")    #删除指定的字符串
print(names)

del names[1]            #删除指定下标的字符串,也可以删除变量
print(names)

names.pop(1)            #删除指定下标的字符串,如果没有指定则是删除最后一个
print(names)


#输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu']
['zhangsan', 'wangwu', 'taoliu']
['zhangsan', 'taoliu']
['zhangsan']


#5)统计字符串有几个(数量)
print(names)
print(names.count("lisi"))      #统计列表中字符串“lisi”的数量

输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu', 'lisi']
2


#6)反转、排序、扩展:
names = ["zhangsan","lisi","wangwu","taoliu","lisi"]
print(names)

names.reverse()     #反转:字符串顺序反转
print(names)

names2 = ["*a","As","9c","iu"]
names2.sort()       #排序:特殊字符>数字>大写字母>小写字母
print(names2)

names.extend(names2)    #扩展:把变量name2合并到names后
print(names)

#输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu', 'lisi']
['lisi', 'taoliu', 'wangwu', 'lisi', 'zhangsan']
['*a', '9c', 'As', 'iu']
['lisi', 'taoliu', 'wangwu', 'lisi', 'zhangsan', '*a', '9c', 'As', 'iu']


#7)复制:
#浅copy:names2把names变量第一层列表复制了一份,修改一个另一个不会变;
#二层列表不会被copy,浅copy只是copy一个内存地址,地址还是指向原变量。等于是一个软连接,修改一个另一个也会改变。

names = ["zhangsan","lisi",["emm","haha"],"wangwu","taoliu","lisi"]

names2 = names.copy()    
print(names)
print(names2)

names[1] = "李四"
names[2][0] = "yurisa"
print(names)
print(names2)

#输出结果:
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', '李四', ['yurisa', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['yurisa', 'haha'], 'wangwu', 'taoliu', 'lisi']

##其他浅copy方法:
person = ["len",["nuan"],68]
import  copy
print(person)

p1=copy.copy(person)
p2=person[:]
p3=list(person)

print(p1)
print(p2)
print(p3)

#输出结果:
['len', ['nuan'], 68]
['len', ['nuan'], 68]
['len', ['nuan'], 68]
['len', ['nuan'], 68]

#深copy:
names = ["zhangsan","lisi",["emm","haha"],"wangwu","taoliu","lisi"]
import copy

names2 = copy.deepcopy(names)       #把所有层的列表完全复制
print(names)
print(names2)

names[1] = "李四"
names[2][0] = "yurisa"
print(names)
print(names2)

#输出结果:修改names,names2没有任何变化
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', '李四', ['yurisa', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']


2)元组

1.什么是元组?
元组其实跟列表差不多,也是存一组数,只不过它创建后就不能修改了。又叫只读列表。


元组和列表写法的区别:
元组|names = ("zhangsan","lisi","wangwu")
---|---
列表|names = ["zhangsan","lisi","wangwu"]


  • 元组的应用场景
    • 写程序时,一些不能被改变的值,可以使用元组
    • 同时也可以提醒别人这是不能修改的值

购物车程序练习
需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2.允许用户根据商品编号购买商品
3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4.可是谁是退出,退出是,打印已购买商品和余额

#Author:byh
product_list = [    #商品列表
    ("Iphone",5800),
    ("Mac Pro",9800),
    ("Bike",700),
    ("Watch",10060),
    ("Coffee",31),
    ("Alex Python",120),
]
salary = input("input your salary:")    #输入工资
shopping_list = []  #购物车列表

if salary.isdigit():    #判断工资是不是数字
    salary = int(salary)    #如果是数字转换为int类型
    while True:         #进入死循环
        for index,item in enumerate(product_list):
            print(index,item)   #循环打印商品列表,取出下标做商品序号
        user_choice = input("choose buy?>>:")   #用户选择要买的商品序号
        if user_choice.isdigit():   #输入的是不是数字
            user_choice = int(user_choice)  #如果是数字转换为int类型
            if user_choice < len(product_list) and user_choice >=0:   #判断商品编号是否存在,len()判断列表长度,会返回一个数字
                p_item = product_list[user_choice]      #通过下标取出用户选中商品
                if p_item[1] <= salary:                 #对比商品价格工资,买不买得起
                    shopping_list.append(p_item)        #商品添加到一个购物车列表里
                    salary -= p_item[1]                 #扣钱,工资减商品价格
                    print("Added %s in to shopping cart,"
                          "your current balance is \033[1;31m%s\033[0m" %(p_item,salary))  #显示余额
                else:
                    print("\033[1;41m你的余额只剩[%s]啦,再买你的肾没了\033[0m" % salary)      #买不起
            else:
                print("product code [%s] is not exist!" % user_choice)   #输入超过列表长度(商品编号),商品序号不存在

        elif user_choice == 'q':   #输入q退出
            print("--------- shopping list ---------")    #打印购物车列表
            for p in shopping_list:     #如果不使用for循环,直接打印会输出在同一行
                print(p)
            print("你的余额:",salary)   #显示余额,退出
            exit()
        else:
            print('invalid option')     #用户输入的不是数字报错
else:
    print("\033[4;31m请输入正确的工资数\033[0m")








2.字符串的使用

#Author:byh
name = "my \tname is hui"
print(name.capitalize())    #首字母大写
print(name.count("i"))      #统计字符
print(name.center(50,"-"))  #一共打印50个字母,如果不够用 - 在前后补上


print(name.endswith("i"))    #判断字符串,以什么结尾
print(name.expandtabs(tabsize=30))  #可以把tab转换成多少个空格
print(name.find("name"))          #查找字符放回索引,索引是搜索的字符是第几个
print(name[name.find("name"):8])  #打印列表位置4-8的字符
print("alex li".find("l"))  #从左边开始查找“alex li”,找到最左边的值
print("alex li".rfind("l")) #从左边开始查找“alex li”,找到最右边的值


name = "my \tname is {name}, and i am {year} years old"
print(name.format(name='hui',year='22'))
print(name.format_map({'name':'hui','year':'22'}))


print('ab23'.isalnum())  #判断是否只包含小数和字母
print('aAF'.isalpha())   #判断是否是纯英文字符
print('12'.isdecimal())  #判断是否是十进制数字
print('12'.isdigit())    #判断是不是一个整数
print('name'.isidentifier()) #判断是不是一个合法的标识符(变量名)


print('+'.join(['1','2','3']))   #把列表合并成字符串
print(name.ljust(50,'-'))  #一共打印50个字母,如果不够用 - 在后面补上
print(name.rjust(50,'-'))  #一共打印50个字母,如果不够用 - 在前面补上

print('Jack'.lower())     #大写变小写
print('Jack'.upper())     #小写变大写
print('      Jack\n'.strip())  #去除左边和右边的空格和回车


p = str.maketrans("abcdef","123456")   #前面的"abcdef"对应"123456"
print("abcdefg".translate(p))   #匹配到对应字符串会转换


print("jack chen".replace('c','z',1))  #字符串替换
print("jack chen em".split())          #把字符串分成列表,默认使用空格做分隔符
print("1+2+3+4+5".split("+"))          #可以指定分隔符
print("1+2\n3+4+5".splitlines())       #使用换行符做分隔符


print("Jack Chen".swapcase())          #字符串大小写转换
print("jack chen".title())             #字符串首字母大写








3.字典

1)字典的基本用法:增删改查

#语法 key-value 格式key:value
#特性:字典是无序的,key必须是唯一的
info = {
    'stu01':"ying",
    'stu02':"jack",
    'stu03':"hui",
}

#查找
print(info)
print(info.get("stu04")) #查找key对应的value
print(info["stu01"])     #打印key对应的value
print("stu03" in info)   #判断key是否存在,返回True或False

#输出结果:
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
None
ying
True



#修改和增加
print(info)
info['stu02'] ="Jack Chen"    #如果key存在就是修改它,如果不存在就是创建它
print(info)
info['stu04'] ="Zidan Zhen"
print(info)

#输出结果
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'Jack Chen', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'Jack Chen', 'stu03': 'hui', 'stu04': 'Zidan Zhen'}



#删除
print(info)
info.pop("stu03")  #删除指定的的key
del info['stu02']
print(info)

#输出结果:
{'stu01': 'ying', 'stu02': 'Jack Chen', 'stu03': 'hui', 'stu04': 'Zidan Zhen'}
{'stu01': 'ying', 'stu04': 'Zidan Zhen'}


2)字典的其他用法

info = {
    'stu01':"ying",
    'stu02':"jack",
    'stu03':"hui",
}

b = {
    'stu011':"1",
    'stu021':"2",
    'stu031':"3",
}



print(info.keys())     #打印所有的key
print(info.values())   #打印所有的value

#输出结果:
dict_keys(['stu01', 'stu02', 'stu03'])
dict_values(['ying', 'jack', 'hui'])



info.setdefault("stu01","emm")  #先到info取stu01,取到返回。取不到创建新的。
print(info)
info.setdefault("stu011","emm")
print(info)

#输出结果:
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui', 'stu11': 'emm'}



print(info)
info.update(b)      #把两个字典合并,已存在的key替换value,不存在的key创建
print(info)

print(info.items())  #把字典转成列表

#输出结果:
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui', 'stu011': '1', 'stu021': '2', 'stu031': '3'}
dict_items([('stu01', 'ying'), ('stu02', 'jack'), ('stu03', 'hui'), ('stu011', '1'), ('stu021', '2'), ('stu031', '3')])


#创建一个新的初始化字典
c = dict.fromkeys([6,7,8],"test")   
print(c)
c[8] = "zeze"
print(c)


#坑点:创建多层初始化字典,是一个内存地址,修改起一个其他全部变
c = dict.fromkeys([6,7,8],[1,{"name":"jack"},444])
print(c)
c[8][1]["name"] = "haha"
print(c)

#输出结果:
{6: 'test', 7: 'test', 8: 'test'}
{6: 'test', 7: 'test', 8: 'zeze'}
-------------------------------------
{6: [1, {'name': 'jack'}, 444], 7: [1, {'name': 'jack'}, 444], 8: [1, {'name': 'jack'}, 444]}
{6: [1, {'name': 'haha'}, 444], 7: [1, {'name': 'haha'}, 444], 8: [1, {'name': 'haha'}, 444]}



#循环dict
for i in info:
    print(i)
for i in info:
    print(i, info[i])

#输出结果:
stu01
stu02
stu03
stu01 ying
stu02 jack
stu03 hui


3)多级字典嵌套及操作

#key最好不要用中文
'''

book_catalog = {
    "生活类":{
        "运动饮食1:9":["10%靠运动","90%靠饮食"],
        "硅谷工程师爸爸的超强思维训练课":["憨爸在美国","工科学霸思维训练法"],
        "养脾胃就是养命":["脾胃问题是中国人的健康问题","脾气虚,饭后困倦"]
    },
    "人文社科":{
        "乌合之众":["古斯塔夫勒庞","法国著名社会心理学家"],
        "心理暗示力":["一本关于治愈、力量","教育与成功的心理学实践书"]
    },
    "科技":{
        "相对论":["爱因斯坦上帝式的思维方式永远都是迷人的","开启全新宇宙观的巨著永远都能满足人类对宇宙的好奇心"],
        "图解时间简史":["简单有趣","人人都可以读懂的霍金"]
    }
}

book_catalog["生活类"]["运动饮食1:9"][1] += "  ,前面10%更重要"
print(book_catalog["生活类"]["运动饮食1:9"])

#输出结果:
['10%靠运动', '90%靠饮食  ,前面10%更重要']

Process finished with exit code 0








4.集合操作

  • 集合是一个无需的,不重复的数据组合,它的主要作用如下:
    • 去重,把一个列表变成集合,就自动去除重复了
    • 关系测试,测试来那个组数据之前的交集、差集、并集等关系
__author__ = "byh"

list_1 = [1,6,8,2,3,4,1,11,11]
list_1 = set(list_1)    #集合再赋值

list_2 = set([0,5,12,13,11])

print(list_1,type(list_1))          #集合是无序的
print(list_1,list_2)

print(list_1 & list_2)      #交集
print(list_1.intersection(list_2))  #交集:取出两个list中相同的数据
print(list_1 | list_2)      #并集
print(list_1.union(list_2))         #并集:合并两个list的数据

#输出结果:
{1, 2, 3, 4, 6, 8, 11} <class 'set'>
{1, 2, 3, 4, 6, 8, 11} {0, 5, 11, 12, 13}
{11}
{11}
{0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13}
{0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13}


print(list_2 - list_1)      #差集
print(list_1.difference(list_2))    #差集:取出我有的你没有的数据
print(list_2.difference(list_1))

#输出结果:
{0, 13, 12, 5}
{1, 2, 3, 4, 6, 8}
{0, 13, 12, 5}


print(list_1 ^ list_2)      #对称差集
print(list_1.symmetric_difference(list_2))  #对称差集:把我有你没有,你有我没有的数据取出来放一起

#输出结果:
{0, 1, 2, 3, 4, 5, 6, 8, 12, 13}
{0, 1, 2, 3, 4, 5, 6, 8, 12, 13}


list_3 = set([1,2,3])
print(list_3 <= list_1)     #子集
print(list_3.issubset(list_1))      #子集,list_3的数据,list_1里面都有
print(list_1 >= list_3)     #父集
print(list_1.issuperset(list_3))    #父集,list_1的数据包括list_3

#输出结果:
True
True
True
True


list_4 = set([0,4,5])
print(list_3.isdisjoint(list_4))    #关系测试:测试有没有交集,没有True/有False

#输出结果:
True


#基本操作:
print(list_1)
list_1.add("emm")       #添加一项数据
list_1.update(["haha","ge","ze"])         #添加多项数据
print(list_1)

list_1.remove("ge")     #删除指定一项数据
print(list_1)

print(list_1.pop())     #任意删除一项数据
print(list_1)

print(list_1.discard("ze"))     #删除指定的一项数据,数据不存在不会报错
print(list_1)
print(list_1.discard("dd"))
print(list_1)

print(len(list_1))      #打印长度

#输出结果:
{1, 2, 3, 4, 6, 8, 11}
{1, 2, 3, 4, 'emm', 6, 8, 'ze', 11, 'haha', 'ge'}
{1, 2, 3, 4, 'emm', 6, 8, 'ze', 11, 'haha'}
1
{2, 3, 4, 'emm', 6, 8, 'ze', 11, 'haha'}
None
{2, 3, 4, 'emm', 6, 8, 11, 'haha'}
None
{2, 3, 4, 'emm', 6, 8, 11, 'haha'}
10


a = [1,2,3]
b = [4,5,6]

print(1 in a)   #判断 1 是否 a的成员
print(1 in b)   #判断 1 是否 b的成员

#输出结果:
True
False








5.文件操作

对文件的操作流程:
○ 打开文件,得到文件句柄并赋值给一个变量
○ 通过句柄对文件进行操作
○ 关闭文件

打开文件的模式有:

○ r,只读模式(默认)。
○ w,只写模式。【不可读;不存在则创建;存在则删除内容;】
○ a,追加模式。【不可读;不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件

○ r+,可读写文件。【可读;可写;可追加】
○ w+,写读
○ a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

○ rU
○ r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

○ rb,二进制文件读取
○ wb,以人进制编码的方式写入字符
○ ab
__author__ = "byh"


#文件只读模式
f = open("yesterday2","r",encoding="utf-8")      #文件句柄(文件内存对象:文件名、文件大小、字符集、硬盘起始位置)
data = f.read()     #打开文件时从头开始读,读到哪,“光标”在哪。
print(data)
f.close()           #关闭文件

#查看1-5行
f = open("yesterday2","r",encoding="utf-8")
for i in range(5):
    print(f.readline())
f.close()


#文件只写模式
f = open("yesterday2","w",encoding="utf-8")
f.write("emm")
f.close()

#文件追加模式
f = open("yesterday2","a",encoding="utf-8")
f.write("\n1\n")
f.write("2\n")
f.write("3")
f.close()

#查看文件内容,在line 9打印---em
f = open("yesterday2","r",encoding="utf-8")
#print(f.readlines())     #以列表的方式打印,只适合读小文件
for index,line in enumerate(f.readlines()):
    if index == 9:
        print('---em')
        continue
    print(line.strip())
f.close()

#查看文件内容,在line 9打印---------
f = open("yesterday2","r",encoding="utf-8")
#print(f.readline())     #打印一行
count = 0
for line in f:
#    print(line)     #效率最高
    if count == 9:
        print("---------")
        count += 1
        continue
    print(line)
    count += 1
f.close()


f = open("yesterday2","r",encoding="utf-8")
print(f.tell())     #打印“ 光标 ”当前位置(字符个数)
f.seek(0)           #“ 光标 ”回到哪个地方

print(f.encoding)   #打印文件编码格式
print(f.fileno())   #系统IO文件接口编号
print(f.flush())    #强制刷新,在文件打开的强制写入到硬盘
f.close()


f = open("yesterday2","r+",encoding="utf-8")        #读写,内容追加到最后
f = open("yesterday2","rb")     #二进制文件读取
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()

f = open("yesterday2","wb")     #二进制文件写入
f.write("emmmmmm\n".encode())   #以二进制编码的方式写入字符
f.close()


f = open("yesterday2", "r", encoding="utf-8")
f_new = open("yesterday2.bak", "w", encoding="utf-8")

for line in f:
    if "haha" in line:
        line = line.replace("haha", "em")
    f_new.write(line)
f.close()
f_new.close()
#with:自动关闭文件,同时打开多个文件
with open ("yesterday","r",encoding="utf-8") as f , \
        open("yesterday2","r",encoding="utf-8") as f2:
    for i in f:
        print(i)
    for ii in f2:
        print(ii)

#进度条,flush的作用
__author__ = "byh"
import sys,time

for i in range(20):
    sys.stdout.write("#")       #标准输出
    sys.stdout.flush()
    time.sleep(0.1)

6.文件编码

1)bytes数据类型

  • python数据类型
    • bytes(计算机识别的16进制)
    • string(人识别的字符串)

bytes和string之间的相互转换

msg = "北京下雪天"
print(msg)
print(msg.encode(encoding="utf-8"))
print(msg.encode(encoding="utf-8").decode(encoding="utf-8"))

输出结果:

北京下雪天
b'\xe5\x8c\x97\xe4\xba\xac\xe4\xb8\x8b\xe9\x9b\xaa\xe5\xa4\xa9'
北京下雪天

Process finished with exit code 0

2)GBK转换为UTF-8格式:

1、首先通过编码【decode】转换为Unicode编码、string类型;
2、然偶后通过解码【encode】转换为UTF-8的编码、bytes类型;

#-*-coding:gbk -*-       #声明、修改文件编码
__author__ = "byh"
import sys
print(sys.getdefaultencoding())     #查看默认编码
s = "你好"    #python字符串编码默认是unicode
print(s.encode("gbk"))      #默认unicode,直接使用encode解码,转换为gbk
print(s.encode("utf-8"))        #解码转换为utf-8
print(s.encode("gb2312").decode("gb2312"))

猜你喜欢

转载自www.cnblogs.com/byho/p/9054285.html