python 3 day2(下)
对一、今天主要讲的是python中浅copy和深copy的用法和区别。如下图,使用copy可以完整的复制一个列表。
将下标为3的值alex更改为ALEXANDER的方法为 names[3][0] = 更改后的值(注意后面一个下标0为小列表中alex下标位置的意思)
此时的打印结果为:
我们会发现“向鹏”在names和name2中选择性copy了,但是ALEXANDER在1和2 中都被copy了。说明copy只是浅copy只copy了第一层。
如果我更改了name2的值,names会跟着被copy吗?答案是会。
如果需要完完全全的复制一份列表应该怎么操作?
再看看步长切片的应用:
结果如下,隔一个值取一个:
2.元组
元组其实和列表差不多,也是存一组数,只不过它一旦创建,便再也不能修改,所以又叫只读列表。
语法:
它只有2个方法,一个是count,一个是index,完毕。
程序练习
请闭眼写出以下程序
程序:购物车程序
需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2.允许用户根据商品编号购买商品
3.用户选择商品后,检测余额是否够,够就直接付款,不够就提醒
4.可随时退出,退出是,打印已购买商品和余额。
先理清一个程序的主要逻辑思路之后,你会发现通过不断的积累这些逻辑思维,写起程序来不再是一脸茫然了。
但此时我们会发现,运行结果中没有产品编号,只能运行一次:
由于这些产品在列表中有下标,我们可以使用下标来当产品编号:
将print改为上图所示后,运行结果我们可以看出,下标出来了:
还有更为简便的写法,即使用enumerate将列表中数据的下标直接取出来:
完善之后的简易版程序脚本是这样的:
仔细看会发现,这个程序目前只考虑了买的起的情况,不涉及买不起的情况,如果买不起应该怎样去写呢?很简单,只需在Added那行代码下面新增一个else:
运行结果显示如下:
那么问题又来了,程序不可能无止境的运行下去,如果想退出该程序,应该如何操作呢?
二、字符串操作
name.capitalize() 首字母大写 name.casefold() 大写全部变小写 name.center(50,"-") 输出 '---------------------Alex Li----------------------' name.count('lex') 统计 lex出现次数 name.encode() 将字符串编码成bytes格式 name.endswith("Li") 判断字符串是否以 Li结尾 "Alex\tLi".expandtabs(10) 输出'Alex Li', 将\t转换成多长的空格 name.find('A') 查找A,找到返回其索引, 找不到返回-1 format : >>> msg = "my name is {}, and age is {}" >>> msg.format("alex",22) 'my name is alex, and age is 22' >>> msg = "my name is {1}, and age is {0}" >>> msg.format("alex",22) 'my name is 22, and age is alex' >>> msg = "my name is {name}, and age is {age}" >>> msg.format(age=22,name="ale") 'my name is ale, and age is 22' format_map >>> msg.format_map({'name':'alex','age':22}) 'my name is alex, and age is 22' msg.index('a') 返回a所在字符串的索引 '9aA'.isalnum() True '9'.isdigit() 是否整数 name.isnumeric name.isprintable name.isspace name.istitle name.isupper "|".join(['alex','jack','rain']) 'alex|jack|rain' maketrans >>> intab = "aeiou" #This is the string having actual characters. >>> outtab = "12345" #This is the string having corresponding mapping character >>> trantab = str.maketrans(intab, outtab) >>> >>> str = "this is string example....wow!!!" >>> str.translate(trantab) 'th3s 3s str3ng 2x1mpl2....w4w!!!' msg.partition('is') 输出 ('my name ', 'is', ' {name}, and age is {age}') >>> "alex li, chinese name is lijie".replace("li","LI",1) 'alex LI, chinese name is lijie' msg.swapcase 大小写互换 >>> msg.zfill(40) '00000my name is {name}, and age is {age}' >>> n4.ljust(40,"-") 'Hello 2orld-----------------------------' >>> n4.rjust(40,"-") '-----------------------------Hello 2orld' >>> b="ddefdsdff_哈哈" >>> b.isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则 True
三、字典操作
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
例如我们需要把全国人民的年龄、身高、性别等信息存下来(实际上使用列表的方式也可以进行存储操作,但是需要记住每一个值的下标信息,这样就太麻烦了),这里介绍一种更为简便实用的方法:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
此时我们会发现,print打印之后显示是无序的,这是因为字典没有下标的原因导致的。由于字典是无序的,所以我们取值时通过key进行的,print(key名称)即可。由此发现:
字典的特性:
(1)dict是无序的
(2)key必须是唯一的,so 天生去重。
那现在“查”是可以查询了,字典中可以进行修改操作吗?可以的,先来看下 对已存在信息进行修改的操作是怎样的:
如果对原字典不存在的信息进行修改可以修改成功吗?例如原字典中本没有stu1104这个key,现在我们操作将stu1104修改为“宫本武藏”,结果会是怎样的?
打印之后的结果显示,对于不存在的字典信息进行修改时,会自动新增该条不存在的信息。
打印出来的结果如下:
本节课课后作业:
购物车
用户入口:
1.商品信息存在文件里
2.已购商品、余额记录(长时间留存)。
商家入口:
1.可以添加商品,修改商品价格