1.切片(对list取值的一种方式)
#切片 li = [1,2,3,4,5,6,7,8] print(li[0:4])#切片顾头不顾尾,左闭右开,[0:4]取的是list[0]~list[3] print(li[:3])#冒号左面不写默认是0 print(li[:])#两面都不写,取所有 print(li[::2])#隔一个取一个 print(li[0:3:2])#重list[0]~list[2]隔一个取一个 print(li[::-2])#从最后一个开始往前隔一个取一个 print(li[-1:-4:-2])#从最后一个开始往前隔一个取一个取到倒数第四个 测试结果: [1, 2, 3, 4] [1, 2, 3] [1, 2, 3, 4, 5, 6, 7, 8] [1, 3, 5, 7] [1, 3] [8, 6, 4, 2] [8, 6]
2.复制
#复制分为浅复制和深复制两种, # 浅复制,被复制者a和复制者b之间的关系:二者指向同一内存地址,修改a就是修改b,修改b也等同于修改a # 深复制,被复制者a和复制者b之间的关系:二者指向不同的内存地址,二者之间的修改不会互相影响 #1.浅复制举例 #这样复制的话就是浅复制,li和li2指向的是同一个地址,所以li修改也就是li2修改,li2修改也是li修改 li = [1,2,3,4] li2 = li print('li的id地址为:%s' % id(li)) print('li2的地址为:%s' % id(li2)) 测试结果: li的id地址为:4434112328 li2的地址为:4434112328
#2.深复制举例 #深复制方法1 li = [1,2,3,4] li2 = li[:] print('li的id地址为:%s\nli的内容为:%s' % (id(li),li[:])) print('li2的地址为:%s\nli2的内容为:%s' % (id(li2),li2[:])) 测试结果: li的id地址为:4351401800 li的内容为:[1, 2, 3, 4] li2的地址为:4351401864 li2的内容为:[1, 2, 3, 4]
#深复制方法2 import copy li = [1,2,3,4] li2 = copy.deepcopy(li) print('li的id地址为:%s\nli的内容为:%s' % (id(li),li[:])) print('li2的地址为:%s\nli2的内容为:%s' % (id(li2),li2[:])) 测试结果: li的id地址为:4509234312 li的内容为:[1, 2, 3, 4] li2的地址为:4508405384 li2的内容为:[1, 2, 3, 4]
#遍历list的话不要随便删除list元素,否则会导致下标错乱 li = [1,1,2,3,4,5,6,7,8,8,8,9] #获取list中所有偶数 #正确写法: li2 = li[:] for l in li2: if l % 2 != 0: li.remove(l) print(li) 测试结果: [2, 4, 6, 8, 8, 8] # 错误写法 for i in li: if i%2!=0: li.remove(i) print(li) 测试结果: [1, 2, 4, 6, 8, 8, 8]
3.非空即真、非0即真
# 空的情况 # s ='' # l = [] # c = {} # y = () # None if None:#是None的话则if不成立走else print('真') else: print('假') #0的情况 if 0 :#是0的话则if不成立走else print('真') else: print('假') 测试结果: 假 假
4.列表生成式
list = [] for i in range(20): n = str(i).zfill(2)#补零函数,小于3位补0 list.append(n) print(list) 测试结果: ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'] #以上代码用一行完成如下: list2 = [str(i).zfill(2) for i in range(20)] print(list2) 测试结果: ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']
#带判断的 list3 = [] for i in range(20): if i < 10: n = str(i).zfill(2)#补零函数,小于3位补0 list3.append(n) print(list3) 测试结果: ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09'] #以上代码用一行完成如下: list4 = [str(i).zfill(2) for i in range(20) if i < 10] print(list4) 测试结果: ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09']
5.三元表达式
#三元表达式 id_card = '321321111111111161' sex = "女" if int(id_card[-2]) % 2 == 0 else '男' print(sex) 测试结果: 女 id_card = '321321111111111111' sex = "女" if int(id_card[-2]) % 2 == 0 else '男' print(sex) 测试结果: 男
6.集合(集合是无序的,而且天生可以去重)
#空集合 c = {} print(c) c2 = set() print(c) 测试结果: {} {} # 添加 # 方法1: c2.add(1) c2.add(2) c2.add(3) print(c2) 测试结果: {1, 2, 3} # 方法2: l = [1,2,2,3,4,9,6] c = set(l) print(c)#集合是无序的,没有下标,没法取值,若要取值可以先变成list然后再取 测试结果: {1, 2, 3, 4, 6, 9} #删除 c2.remove(1) print(c2) 测试结果: {2, 3}
#交集、并集、差集、对称差集 list1_name = ['wangxiaoyu','lixiaokai','lijunhao','lixinran','yaoyao'] list2_name = ['wangxiaoyu','lixiaokai','lijunhao','lixinran','liheping','lisan'] set_list1_name = set(list1_name) set_list2_name = set(list2_name) # 1.交集 print("交集_函数方式:",set_list1_name.intersection(set_list2_name)) print("交集_字符方式:",set_list1_name & set_list2_name) # 2.并集 print("并集_函数方式:",set_list1_name.union(set_list2_name)) print("并集_字符方式:",set_list1_name | set_list2_name) # 3.差集 print("差集_函数方式:",set_list1_name.difference(set_list2_name)) print("差集_字符方式:",set_list1_name - set_list2_name) # 4.对称差集 print("对称差集_函数方式:",set_list1_name.symmetric_difference(set_list2_name)) print("对称差集_字符方式:",set_list1_name ^ set_list2_name) 测试结果: 交集_函数方式: {'lixiaokai', 'lijunhao', 'lixinran', 'wangxiaoyu'} 交集_字符方式: {'lixiaokai', 'lijunhao', 'lixinran', 'wangxiaoyu'} 并集_函数方式: {'lijunhao', 'wangxiaoyu', 'lisan', 'yaoyao', 'lixinran', 'lixiaokai', 'liheping'} 并集_字符方式: {'lijunhao', 'wangxiaoyu', 'lisan', 'yaoyao', 'lixinran', 'lixiaokai', 'liheping'} 差集_函数方式: {'yaoyao'} 差集_字符方式: {'yaoyao'} 对称差集_函数方式: {'yaoyao', 'lisan', 'liheping'} 对称差集_字符方式: {'yaoyao', 'lisan', 'liheping'}
7.json操作
#json串就是一个字符串 import json str = { "error_code": 0, "stu_info": [ { "id": 314, "name": "矿泉水", "sex": "男", "age": 18, "addr": "北京市昌平区", "grade": "摩羯座", "phone": "18317155666", "gold": 100 }, { "id": 315, "name": "矿泉水", "sex": "女", "age": 27, "addr": "上海", "grade": "摩羯座", "phone": "18317155668", "gold": 100 } ] } #字典转换成字符串 #文件写成.json格式的话,文件里头的json串就会带颜色,很好看,不过这里的文件后缀无要求 with open('users.json','w',encoding='utf-8') as fw: print('json.dumps转换前:',type(str)) #dumps把字典转换成string字符串,ensure_ascii=False 中文正常显示、indent=4 4个缩进 f = json.dumps(str,ensure_ascii=False,indent=4)#因为字典不可以直接写到文件中,所以写之前要先把字典先转成字符串再写 print('json.dumps转换后:',type(f)) fw.write(f) 测试结果: json.dumps转换前: <class 'dict'> json.dumps转换后: <class 'str'>
#字典格式的字符串转换成字典 with open('users.json','r',encoding='utf-8') as fr: s = fr.read() print('json.loads转换前:',type(s)) ss = json.loads(s) print('json.loads转换后:',type(ss)) 测试结果: json.loads转换前: <class 'str'> json.loads转换后: <class 'dict'>
#直接操作整个文件 #读文件,把字典格式的文件读出来并转换成字典(从文件中读出来的是字符串,所以要通过json转换下) with open(r'users.json',encoding='utf-8') as fr: s = json.load(fr)#直接把文件转换成字典读出来 print('读到的内容类型为:',type(s)) print('读到的内容为:', s) 测试结果: 读到的内容类型为: <class 'dict'> 读到的内容为: {'error_code': 0, 'stu_info': [{'id': 314, 'name': '矿泉水', 'sex': '男', 'age': 18, 'addr': '北京市昌平区', 'grade': '摩羯座', 'phone': '18317155666', 'gold': 100}, {'id': 315, 'name': '矿泉水', 'sex': '女', 'age': 27, 'addr': '上海', 'grade': '摩羯座', 'phone': '18317155668', 'gold': 100}]}
#直接操作整个文件 #写文件(直接把字典写到文件中) with open(r'users.json','w',encoding='utf-8') as fw:#文件写成.json格式的话,文件里头的json串就会带颜色,很好看,不过这里的文件后缀无要求 json.dump(str,fw,ensure_ascii=False,indent=4)#dumps把字典转换成json格式的string字符串,ensure_ascii=False 中文正常显示、indent=4 4个缩进 测试结果:
8.函数
#def 函数名(参数): # #无参函数,无返回值 def sayHello(): print('hello !') # 调用函数 sayHello() 测试结果: hello ! #有参函数,无返回值 def sayHello(name):#name:形参 print('hello %s !' % name) # 调用函数 sayHello('wangxiaoyu')#wangxiaoyu:实参 测试结果:hello wangxiaoyu ! # 有返回值 def sayHello(name,age=18): return 'hello,' + name + ',age:' + str(age) print(sayHello('lixiaokai')) 测试结果: hello,lixiaokai,age:18
# 写一个判断所给的数字是否是小数的函数 #分析: # 小数分为两种请求,1.正小数 2.负小数 # 1.正小数如:1. 、1.56 #1、只有一个小数点 #2、小数点左右是整数 #2.负小数如:-1.6 #1、只有一个小数点 #2、小数点左边以负号开始,且只有一个符号,且时整数、小数点右边是整数 def is_float(floalt_num): sfn = str(floalt_num)#将传过来的数字转换成字符串,以便用split分割等函数 left_n,right_n = sfn.split('.') if sfn.count('.') == 1: if left_n.isdigit() and right_n.isdigit(): print('正小数!') elif left_n.startswith("-") and left_n[1:].isdigit() and right_n.isdigit(): print('负小数!') else: print('不是合法的小数!',floalt_num) else: print('您输入的小数不合法!',floalt_num) is_float(.2) is_float(1.2) is_float(-1.0) is_float(.2) is_float(1-2.2) 测试结果: 正小数! 正小数! 负小数! 正小数! 负小数!
9.内置函数
import random print(random.randint(0,10))#在0和10之前随机取一个数 测试结果: 2
print(random.sample('1d2345678',3))#在字符串之间随机取几个数 测试结果: ['3', '6', '4']
print(random.uniform(0,99))#随机取小数 测试结果: 53.438953003608724
l = [1,2,4,5,6,7] random.shuffle(l)#把list中的数随机打乱 print(l) 测试结果: [1, 6, 2, 4, 5, 7]
import string print(string.digits)#所有整数 测试结果: 0123456789
print(string.ascii_letters)#所有大写和小写字母 测试结果: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase)#所有小写字母 测试结果: abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)#所有大写字母 测试结果: ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.punctuation)#所有特殊符号 测试结果: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print(random.choice(string.digits))#所有整数随机取一个 测试结果: 8
#案例 #产生一批用户名,长度在6-12之间,产生这一批用户名不能重复,用户名需要以字母开头,必须包含字母和数字 #分析 #1.函数中传递一个用户名的条数的参数,数字是几循环几次 #2.随机获取一个6-12之间的长度 #3.因为用户名不能重复,所以用集合存放用户名 #4.产生6-12个包含数字和字母,以字母开头(与所有的大小写字母存在交集,与所有的数字存在交集) import random import string def random_name(n): names = set()#集合,自动去重 while True: rn = random.randint(6,12)#随机产生一个数字,要求数字值在6到12之间 name = random.sample(string.ascii_letters + string.digits,rn)#在所有大小写字母及数字之间随机产生rn个字符 if len(names) == n:#如果长度等于用户要求的条数,结束 break #1.产生的用户名第一个字符是字母2.用户名与26个字母大小写存在交集3.用户名与所有数字存在交集 if name[0] in string.ascii_letters and set(name) & set(string.ascii_letters) and set(name) & set(string.digits): names.add("".join(name) + '@163.com')#join将list转换成字符串 return names print(random_name(5))#产生5条有户名邮箱 测试结果: {'[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]'}