python-python基础2
本节内容:
- 列表
- 元组
- 阶段性练习
- 字符串
- 字典
1 列表
列表的定义方式:
names = ["wukong","shifu","bajie","wuneng"]
列表中的元素是从0开始编号的,例如,取出列表中的第二个元素:
print(names[1]) #没错,下标就是1
1 names = ["wukong","shifu","bajie","wuneng"] 2 print(names[3]) 3 print(names[-1]) # 可以倒着取 4 print(names[-2])
上面的输出结果是:
wuneng
wuneng
bajie
下面开始讲解关于列表的一些操作:
切片(取多个元素)
1 names = ["wukong","shifu","bajie","wuneng"] 2 3 print(names[1:3]) #取下标是1和2的元素,不包含3 4 print(names[:3]) #从0开始取,一直取到下标为2的元素,3取不到 5 print(names[2:]) # 从下标为2的开始,一直取到最后,包含最后一个。 6 print(names[-3:]) # 取后三个元素 7 print(names[::2]) # 从头开始,每隔一个元素取一个
输出结果:
['shifu', 'bajie'] ['wukong', 'shifu', 'bajie'] ['bajie', 'wuneng'] ['shifu', 'bajie', 'wuneng'] ['wukong', 'bajie']
追加
names = ["wukong","shifu","bajie","wuneng"] names.append("leihaidong") print(names) #输出 ['wukong', 'shifu', 'bajie', 'wuneng', 'leihaidong']
插入
names = ["wukong","shifu","bajie","wuneng"] names.insert(1,"chenronghua") print(names) # output ['wukong', 'chenronghua', 'shifu', 'bajie', 'wuneng']
修改
names = ["wukong","shifu","bajie","wuneng"] names[1] = "tangsheng" print(names) # output ['wukong', 'tangsheng', 'bajie', 'wuneng']
删除
names = ["wukong","shifu","bajie","wuneng"] names.remove("shifu") #方法一 # del names[1] # 方法二 # names.pop(1) # 方法三 print(names) #output ['wukong', 'bajie', 'wuneng']
扩展
names = ["wukong","shifu","bajie","wuneng"] names2 = [1,2,3,4] names.extend(names2) print(names, names2) #output ['wukong', 'shifu', 'bajie', 'wuneng', 1, 2, 3, 4] [1, 2, 3, 4]
上面的代码中,names2可以用完后删除:
... del names2 print(names2) # 添加这两句代码后会报错,提示names2不存在
拷贝
拷贝操作是比较有坑的一个操作。我们从简单讲起:
names = ["wukong","shifu","bajie","wuneng"] names2 = names.copy() print(names, names2) names[2] = "八戒" print(names, names2) #output ['wukong', 'shifu', 'bajie', 'wuneng'] ['wukong', 'shifu', 'bajie', 'wuneng'] ['wukong', 'shifu', '八戒', 'wuneng'] ['wukong', 'shifu', 'bajie', 'wuneng']
第一行输出结果显示两个列表一模一样。第二行输出结果是原来列表修改后的结果,根据结果可以推断,原列表和复制后的列表分别占用不通的地址空间。看上去就是这么简单。那么我们再来看一个例子:
1 user1 = ["wukong","shifu","bajie",["Jason", "Zhuo"],"wuneng"] 2 user2 = user1.copy() 3 4 user1[2] = "八戒" 5 user1[3][0] = "James" 6 print(user1, user2) 7 8 #output: 9 ['wukong', 'shifu', '八戒', ['James', 'Zhuo'], 'wuneng'] ['wukong', 'shifu', 'bajie', ['James', 'Zhuo'], 'wuneng']
我们可以看到,user1是一个列表,但是他的特殊之处是列表中第四个元素也是一个列表,这种情况下直接用user.copy得到的结果是第四个元素只拷贝了第四个元素(列表)的地址,并没有拷贝其所在的空间,即第一级列表所占用的空间得到了全部拷贝,其中的列表只是一个地址而已,拷贝的时候只是拷贝了地址。所以结果是修改第四个元素里的内容的时候,其实是修改的同一个地址空间的内容。这就是浅拷贝(用处较少,比如联合账号可以用)。为了解决这个问题,修改代码如下:
import copy # 导入copy模块 user1 = ["wukong","shifu","bajie",["Jason", "Zhuo"],"wuneng"] user2 = copy.deepcopy(user1) # 深度拷贝 user1[2] = "八戒" user1[3][0] = "James" print(user1, user2) # output: ['wukong', 'shifu', '八戒', ['James', 'Zhuo'], 'wuneng'] ['wukong', 'shifu', 'bajie', ['Jason', 'Zhuo'], 'wuneng']
上面可以看出,无论是是第一级列表,还是第二级列表,都分别是各自互不干扰的独立空间。
翻转
names = ["wukong","shifu","bajie","wuneng"] names.reverse() print(names)
排序
names = ["wukong","shifu","bajie","wuneng"] names.sort() print(names)
统计
names = ["wukong","shifu","bajie","wuneng"] print(names.count("shifu"))
索引
names = ["wukong","shifu","bajie","wuneng"] print(names.index("shifu"))
2 元组
元组一但创建就不能修改,所以元组可以称作是只读列表。由于不能修改,所以对应的操作也就比较少。
创建元组的语法:
names = ("wukong", "shifu", "bajie", "wujing")
元组的两个操作:
names = ("wukong", "shifu", "bajie", "wujing") print(names.count("bajie")) print(names.index("wujing"))
3 阶段性练习
使用目前为止学习到的基础语法完成以下练习。
购物车程序,要求如下:
- 启动程序后,让用户输入余额,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
1 # Author: Jason Zhuo 2 balance = int(input("Please input your salary as balance: ")) 3 goods_list = [["Hisense Video",4200],["Haier refrigerator",3000],["bike",800],["MI air cleaner",600],["washing machine",3199]] 4 shopping_cart = [] 5 q = "Y" 6 7 while q == "Y": 8 print("goods_list:") 9 for i in goods_list: 10 print("%2d | %20s | %6d" % (goods_list.index(i)+1, i[0], i[1])) 11 num = input("input the goods num which do you want:") 12 if num.isdigit(): 13 num = int(num) 14 if num <= len(goods_list) and num >= 1: 15 if goods_list[num-1][1]< balance: 16 shopping_cart.append(goods_list[num-1]) 17 balance -= goods_list[num-1][1] 18 print("in your shopping cart(balance is %d):" % balance) 19 for j in shopping_cart: 20 print("%2d | %20s | %6d" % (shopping_cart.index(j)+1, j[0], j[1])) 21 q = input("Would you like to continue shopping?Y/N") 22 else: 23 print("Sorry,Lack of balance!The balance is %d" % balance) 24 q = input("Would you like to continue shopping?Y/N") 25 else: 26 print("请重新输入商品编号!") 27 for items in shopping_cart: 28 print("%2d | %20s | %6d" % (shopping_cart.index(items) + 1, items[0], items[1])) 29 print("Your balance is ", balance)
4 字符串
python的字符串是不可修改的。
name = "jason zhuo" print(name.capitalize()) #首字母大写 print(name.count("o")) #统计特定字符个数 print(name.center(50,"-")) # 打印50个字符,把name字符串放在中间,不够的用“-”补齐 print(name.endswith("ac")) #判断是不是以“ac”结尾 print(name.expandtabs(tabsize=30)) # 如果字符串中含有“\t”则将其转换成30个空格 print(name.find("s")) #找到对应字符的索引 name = "my name is {name} and i am {age} years old!" print(name.format(name="jason",age=23)) print(name.format_map({"name":"jason","age":12})) print(name.isalnum()) #判定字符串是不是阿拉伯数字 print('abA'.isalpha()) #判断是不是字母 print('1.2'.isdecimal()) #判断是不是十进制数 print("2a".isdigit()) #是不是数字 print("3a".isidentifier()) #判断是不是一个合法的标示符(变量名是否合法) print("aa".islower()) #判断是不是小写 print("aa".isupper()) #判断是不是大写 print(" ".isspace()) # 是不是空格 print("My name is ".istitle()) # print("sldk".isprintable()) # 是否为可打印字符 print('+'.join(['a','b','c'])) # 列表转换成字符串 print(name.ljust(50,'*')) # 打印50个字节,不够的在左侧用*补齐 print(name.rjust(50,'*')) print(name.lower()) # 大写变小写 print(name.upper()) print(' jason'.lstrip()) #去掉左边的空格 print('jason '.rstrip()) print(' jason '.strip()) #同时去掉左右的空格 print("jasona".replace('a','A',1)) # 把小写字母a换成大写字母,无论找到多少个a,只替换一个 print("jasona".rfind('a')) #目标最右边的值的索引 print("jason".split('s')) #参数的作用是指定分隔符,如果不指定分隔符默认是空格。结果是返回一个列表 print('jason'.splitlines()) # 按行分割 print('jaSon'.swapcase()) #字母大小写翻转 print('jason'.title()) #全部首字母大写
5 字典
定义:
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
字典是一种key-value键值对。
查找
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
print(info) # 字典是无序的
# find
print(info['stu1101']) # 方法一:如果不存在会报KeyError
print(info.get('stu1105')) #方法二: 不存在也不会报错,推荐用法。
print('stu1103' in info) #方法三:判断某个字段是不是存在字典里
修改
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
info['stu1101'] = 'shifu' # 修改某个值
print(info)
info['stu1105'] = 'huluwa' # 如果不在则创建
print(info)
删除
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
#删除一个元素
del info['stu1101'] #方法一
info.pop('stu1101') # 方法二
print(info)
获取字典的key和value
print(info.values()) print(info.keys())
给key设置默认值
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
info.setdefault('dawa',['www.baidu.com','in china'])
print(info)
更新
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
b = {'stu1101':'Jason','1':'3',2:5}
info.update(b) # 没有则创建,有则更新
print(info)
转换成列表
print(info.items()) # 字典转成列表
创建字典
fromkeys: 如果值太深(比如是列表),就会有问题。先举一个正常的例子:
c = dict.fromkeys([6,7,8],'test') #初始化一个新的字典 print(c)
下面这个例子就会有问题:
d = dict.fromkeys([6,7,8],[1,2,3]) d[6][1] = 5 print(d)
上述代码输出结果是:
{6: [1, 5, 3], 7: [1, 5, 3], 8: [1, 5, 3]}。 但是预期结果应该是只有key为6的value是[1, 5, 3],其余的key的value应该是[1,2,3],这是因为这种方式生成的字典的value使用的是同一块内存空间。
for循环获取字典信息
info = {'stu1101': 'tangsheng',
'stu1102': 'wukong',
'stu1103': 'bajie',
'stu1104': 'wujing',
}
for i in info: #方式1,推荐.本方式更高效
print(i,info[i])
for k,v in info.items(): #方式2
print(k,v)
阶段性程序练习
程序: 三级菜单
要求:
- 打印省、市、县三级菜单
- 可返回上一级
- 可随时退出程序

浙公网安备 33010602011771号