python-python基础2

本节内容:

  1. 列表
  2. 元组
  3. 阶段性练习
  4. 字符串
  5. 字典

 

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])   # 从头开始,每隔一个元素取一个
View Code

输出结果:

['shifu', 'bajie']
['wukong', 'shifu', 'bajie']
['bajie', 'wuneng']
['shifu', 'bajie', 'wuneng']
['wukong', 'bajie']
View Code

追加

names = ["wukong","shifu","bajie","wuneng"]
names.append("leihaidong")
print(names)

#输出
['wukong', 'shifu', 'bajie', 'wuneng', 'leihaidong']
View Code

插入

names = ["wukong","shifu","bajie","wuneng"]
names.insert(1,"chenronghua")
print(names)

# output
['wukong', 'chenronghua', 'shifu', 'bajie', 'wuneng']
View Code

修改

names = ["wukong","shifu","bajie","wuneng"]
names[1] = "tangsheng"
print(names)

# output
['wukong', 'tangsheng', 'bajie', 'wuneng']
View Code

删除

names = ["wukong","shifu","bajie","wuneng"]
names.remove("shifu")  #方法一
# del names[1]  # 方法二
# names.pop(1)  # 方法三
print(names)

#output
['wukong', 'bajie', 'wuneng']
View Code

扩展

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]
View Code

上面的代码中,names2可以用完后删除:

...
del names2
print(names2)
# 添加这两句代码后会报错,提示names2不存在
View Code

拷贝

拷贝操作是比较有坑的一个操作。我们从简单讲起:

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']
View Code

第一行输出结果显示两个列表一模一样。第二行输出结果是原来列表修改后的结果,根据结果可以推断,原列表和复制后的列表分别占用不通的地址空间。看上去就是这么简单。那么我们再来看一个例子:

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']
View Code

我们可以看到,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']
View Code

上面可以看出,无论是是第一级列表,还是第二级列表,都分别是各自互不干扰的独立空间。

翻转

names = ["wukong","shifu","bajie","wuneng"]
names.reverse()
print(names)
View Code

排序

names = ["wukong","shifu","bajie","wuneng"]
names.sort()
print(names)
View Code

统计

names = ["wukong","shifu","bajie","wuneng"]
print(names.count("shifu"))
View Code

索引

names = ["wukong","shifu","bajie","wuneng"]
print(names.index("shifu"))
View Code

 2 元组

元组一但创建就不能修改,所以元组可以称作是只读列表。由于不能修改,所以对应的操作也就比较少。

创建元组的语法:

names = ("wukong", "shifu", "bajie", "wujing")

元组的两个操作:

names = ("wukong", "shifu", "bajie", "wujing")
print(names.count("bajie"))
print(names.index("wujing"))
View Code

 

3 阶段性练习

使用目前为止学习到的基础语法完成以下练习。

购物车程序,要求如下:

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

 

 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)
View Code

 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)

 

阶段性程序练习

程序: 三级菜单

要求: 

  1. 打印省、市、县三级菜单
  2. 可返回上一级
  3. 可随时退出程序
posted @ 2019-03-12 17:48  bj我心飞翔  阅读(110)  评论(0)    收藏  举报