1、字符串格式化:
有4中方式可以格式化字符串
import datetimeuname = input('请输入你的用户名:')# today = str(datetime.datetime.today())## msg = '欢迎' + uname + '登录' + ',今天的日期是:' + today # 使用+号,必须是字符串类型today = datetime.datetime.today()msg1 = '欢迎%s登录,今天的日期是%s' % (uname, today)print(msg1)msg2 = f'欢迎{uname}登录,今天的日期是{today}' # 只能在python3.6版本以上使用print(msg2)msg3 = '欢迎{name}登录,今天的日期是{dtime}'.format(name=uname,dtime=today)print(msg3)
2、列表
a)list操作
1)一维数组的操作
2)二维数组的操作
3)三维数组的操作
l = ['sara', 'sara', 'john', 'mickey']print(l[0]) # 获取第一个元素print(l[-1]) # 获取最后一个元素# 新增l.append('alex') # 从list末尾添加l.insert(1, 'jack') # 从指定位置添加# 修改# l[0] = 'sara.Li'# 删除# l.pop() # 默认删除最后一个元素# l.pop(10) # 传入一个下标,就删除指定位置的元素,如果传入的值不存在,提示index out of range# l.remove('sara') # 删除指定元素名字,如果传入的值不存在,提示元素不在列表中;如果列表中存在多个相同的值,只删除第一个# del[-1] # 指定下标删除# 其它的方法:# l.clear() # 清空list# print(l.count('sara')) # 返回元素的个数,不存在返回0# print(l.index('sara1')) # 找指定元素的下标 ,输入不存在的元素,提示元素不再列表中;一般先用count元素是否存在# l.sort(reverse=True) # 默认是升序,加reverse=True,按降序# l.reverse()# print(l)l2 = [[1,2],[3,4]] # 二维数组l3 = [[1,2,3,[4,5,6]]] # 三维数组print(l2[1][1])print(l3[0][3][2])
b)列表的练习
一般来说,嵌套的越少越好
usernames = ["admin", "test", "xiaohei"]passwords = [123456, 456789, "abc123"]# for i in range(3):# uname = input('请输入用户名;').strip()# uPwd = input('请输入密码:').strip()## if uname == '' or uPwd == '':# print('用户名/密码不能为空')# elif uname.count(uname) == 0:# print('用户名不存在')# else:# index = usernames.index(uname)# password = str(passwords[index])# if uPwd == password:# print('登录成功')# break# else:# print('密码错误')# else:# print('登录错误次数过多')for i in range(3):uname = input('请输入用户名;').strip()uPwd = input('请输入密码:').strip()if uname == '' or uPwd == '':print('用户名/密码不能为空')continueelif uname.count(uname) == 0:print('用户名不存在')continueindex = usernames.index(uname)password = str(passwords[index])if uPwd == password:print('登录成功')breakelse:print('密码错误')else:print('登录错误次数过多')
c)列表的循环
users = [["admin", 123456],["test", 456789],["xiaohei", "abc123"],]# 判断元素是否在list中# usename = input('请输入用户名:')# if usename in usernames:# print('用户名存在')# else:# print('用户名不存在')# for username in usernames:# print(username)for i in range(3):uname = input('请输入用户名;').strip()uPwd = input('请输入密码:').strip()if uname == '' or uPwd == '':print('用户名/密码不能为空')continueelif uname.count(uname) == 0:print('用户名不存在')continuefor user in users:password = str(user[1])if uPwd == password:print('登录成功')quit()else:print('密码错误')else:print('登录错误次数过多')
3、布尔类型
True,False
usernames = ["admin", "test", "xiaohei"]print('admin' in usernames)#if 表达式后面要么是True或者False
4、字典
a)字典的基本操作
import pprint# 字典是无序的stus = {'name': 'sara','id': 1,'age': 18,'addr': '北京','height': 188,}# 获取元素# print(stus.get('name1')) # 输入一个不存在的key值,返回None# print(stus.get('sex','女')) # 获取不到对应的key值,把女当做sex 对应的value值# print(stus['name1']) # 输入一个不存在的key值,报错提示KeyError# 修改stus['age'] = 36# 新增stus['phone'] = 110stus.setdefault('email', 'abc@qq.com')# 新增存在的key,setdefault不会修改原始的值,但是dict['name']会stus['phone'] = 119stus.setdefault('email', '123@qq.com')# 删除# stus.pop('age') # 删除指定的key值# del stus['age']# stus.popitem() # 随机删除一个元素# pprint.pprint(stus, indent=4)# 其它方法# stus.clear() # 清空字典print(stus.values()) # 字典里面所有的valueprint(stus.keys()) # 字典里面所有的keyprint(stus.items()) # 把字典转成二维数组,二维数组里面的每个元素就是字典的key,valuestu2 = {'money': 1000}stus.update(stu2) # 把一个字典里面的值,放到另外一个字典里面去;字典的合并pprint.pprint(stus, indent=4)
b)字典的嵌套
import pprintinfo = {'sara': {'age': 18,'addr': 'beijing','cars': ['bmw', 'ben-z', 'audi']},'lily': {'house': {'bj': ['海淀区', '昌平区', '朝阳区', '西城区'],'sh': ['静安区', '闸北区']},'money': 5000}}# cars =info.get('sara').get('cars')# cars.append('tesla')info['lily']['house']['bj'].remove('昌平区')info['lily']['money'] +=5000000pprint.pprint(info)
c)字典的练习
import datetimeusers = {"admin":123456,"test":456789,"dev":"acb12234"}import datetimetoday = datetime.datetime.today()for i in range(3):uname = input("username:").strip()pwd = input("password:").strip() #if uname == "" or pwd == "":print("账号/密码不能为空!")elif uname not in users.keys():print("账号不存在!")else:password = str(users[uname])if password == pwd:print("欢迎%s登录,今天的日期是%s" % (uname,today))breakelse:print("密码错误!")else:print("输入错误次数已经达到3次!")
d)字典的循环
d = {'admin': 123456, 'test': 56789}# 字典的循环# 第一种方式效率比较高,直接拿着key找valuefor k in d:print(k) # 取的是字典的key admin testprint(k, d.get(k))# dict_items([('admin', 123456), ('test', 56789)]),先把字典转换成二维数组for k, v in d.items():print(d.items())print(k, v)
e) 判断一个key值是否存在字典里
d = {'admin': 123456, 'test': 56789}u = 'admin'print(u not in d) # 用这种方式更方便print(u not in d.keys())
f)给字典设置默认值
from collections import defaultdict# info = defaultdict(list)info = {}info['abc'] = ['123']info['abc'].append('456')print(info) # {'abc': ['123', '456']}info1 = defaultdict(list)info1.setdefault('123',[])info1['123'].append('456')print(info1) # defaultdict(<class 'list'>, {'123': ['456']})test_list = ['1','2']info2 = {}.fromkeys(test_list,'') # {'1': '', '2': ''}
g)字典排序
stu_score = {"a": 100,"b": 99,"c": 77,"d": 23523,"e": 232,"f": 2323}print(stu_score.items()) # dict_items([('a', 100), ('b', 99), ('c', 77), ('d', 23523), ('e', 232), ('f', 2323)])def func(l):return l[-1]print(dict(sorted(stu_score.items(),key=func)))print(dict(sorted(stu_score.items(),key=lambda l:l[-1])))
我们可以用sorted高阶函数或者用列表的.sort()方法。
sorted高阶函数
d={'a':1,'c':3,'b':2} # 首先建一个字典d#d.items()返回的是: dict_items([('a', 1), ('c', 3), ('b', 2)])d_order=sorted(d.items(),key=lambda x:x[1],reverse=False) # 按字典集合中,每一个元组的第二个元素排列。# x相当于字典集合中遍历出来的一个元组。print(d_order) # 得到: [('a', 1), ('b', 2), ('c', 3)]
下面是sorted排序方法的详细解释:
sorted高阶函数语法格式: sorted(可迭代对象,key=函数名,reverse=False/True)
作用:从可迭代对象中,依次取出一个元素,该元素再按照key规定的排列依据排序。
可迭代对象:即可依次取值的对象,例如:集合,序列(列表,字符串,元组),字典等。
key : 是列表排列的依据,一般可以自定义一个函数返回排序的依据,再把函数名绑定给key。
reverse : 译为反转,reverse默认等于False,从小到大排序。等于True时,从大到小排序。
匿名函数lambda的格式: 函数名 = lambda [形参1,形参2,…] : ,返回操作语句块产生的结果并绑定给函数名。
例如: key=lambda x : x[1]
x:相当于字典集合中的一个**元组**, 例:dict_items([('a', 1), ('c', 3), ('b', 2)])中的**('a', 1)或('c', 3)或('b', 2)**** x[1]**: 返回x中的第二个元素,即键值对元组中的值。dict_items([('a', 1), ('c', 3), ('b', 2)])中的1或2或3
注意:
(1) sorted函数中的可迭代对象不要用字典d,那样只能迭代出的字典d的键。要用d.items()才可迭代出字典的键值对。
例:不能用 d_order=sorted(d,key=lambda x:x[1],reverse=False)要用 d_order=sorted(d.items(),key=lambda x:x[1],reverse=False)
(2) sorted函数排好序后,要绑定一个对象(赋值),例:d_order=sorted(d.items(),key=lambda x:x[1],reverse=False).
因为字典是无序类型,用sorted函数排好序后不绑定d_order,字典会自动打乱顺序。
原文链接:https://blog.csdn.net/cxcxrs/article/details/82459800
h)两个字典合并成一个
1.使用update 方法
>>> u1 = {"name": "xiaoming", "age": 27}>>> u1_info = {"gender": "male"}>>>>>> u1.update(u1_info)>>> print(u1){'name': 'xiaoming', 'age': 27, 'gender': 'male'}
如果想使用 update 这种最简单、最地道原生的方法,但又不想更新到自己身上,而是生成一个新的对象,那请使用深拷贝。
>>>u1 = {"name": "xiaoming", "age": 27}>>> u1_info = {"gender": "male"}>>>>>> from copy import deepcopy>>>>>> full_u1 = deepcopy(u1)>>> full_u1.update(u1_info)>>>>>> print(full_u1){'name': 'xiaoming', 'age': 27, 'gender': 'male'}>>> print(u1){"name": "xiaoming", "age": 27}
2. 先解包再合并字典
使用 ** 可以解包字典,解包完后再使用 dict 或者 {} 就可以合并。
>>> u1 = {"name": "xiaoming", "age": 27}>>> u1_info = {"gender": "male"}>>>>>> full_u01 = {**u1, **u1_info}>>> print(full_u01){'name': 'xiaoming', 'age': 27, 'gender': 'male'}>>>>>> full_u02 = dict(**u1, **u1_info)>>> print(full_u02){'name': 'xiaoming', 'age': 27, 'gender': 'male'}
3. 借助 itertools
在 Python 里有一个非常强大的内置模块,它专门用于操作可迭代对象。
正好我们字典也是可迭代对象,自然就可以想到,可以使用 itertools.chain() 函数先将多个字典(可迭代对象)串联起来,组成一个更大的可迭代对象,然后再使用 dict 转成字典。
>>> import itertools>>>>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>>>>> dict(itertools.chain(profile.items(), ext_info.items())){'name': 'xiaoming', 'age': 27, 'gender': 'male'}
4. 借助 ChainMap
如果可以引入一个辅助包,那我就再提一个, ChainMap 也可以达到和 itertools 同样的效果。
>>> from collections import ChainMap>>>>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>> dict(ChainMap(profile, ext_info)){'name': 'xiaoming', 'age': 27, 'gender': 'male'}
使用 ChainMap 有一点需要注意,当字典间有重复的键时,只会取第一个值,排在后面的键值并不会更新掉前面的(使用 itertools 就不会有这个问题)。
>>> from collections import ChainMap>>>>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info={"age": 30}>>> dict(ChainMap(profile, ext_info)){'name': 'xiaoming', 'age': 27}
5. 使用dict.items() 合并
在 Python 3.9 之前,其实就已经有 | 操作符了,只不过它通常用于对集合(set)取并集。
利用这一点,也可以将它用于字典的合并,只不过得绕个弯子,有点不好理解。
你得先利用 items 方法将 dict 转成 dict_items,再对这两个 dict_items 取并集,最后利用 dict 函数,转成字典。
>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>> full_profile = dict(profile.items() | ext_info.items())>>> full_profile{'gender': 'male', 'age': 27, 'name': 'xiaoming'}
当然了,你如果嫌这样太麻烦,也可以简单点,直接使用 list 函数再合并(示例为 Python 3.x )
>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>> dict(list(profile.items()) + list(ext_info.items())){'name': 'xiaoming', 'age': 27, 'gender': 'male'}
若你在 Python 2.x 下,可以直接省去 list 函数。
>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>> dict(profile.items() + ext_info.items()){'name': 'xiaoming', 'age': 27, 'gender': 'male'}
6. 最酷炫的字典解析式#
Python 里对于生成列表、集合、字典,有一套非常 Pythonnic 的写法。
那就是列表解析式,集合解析式和字典解析式,通常是 Python 发烧友的最爱,那么今天的主题:字典合并,字典解析式还能否胜任呢?
当然可以,具体示例代码如下:
>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>> {k:v for d in [profile, ext_info] for k,v in d.items()}{'name': 'xiaoming', 'age': 27, 'gender': 'male'}
7. Python 3.9 新特性
在 2 月份发布的 Python 3.9.04a 版本中,新增了一个抓眼球的新操作符操作符: |, PEP584 将它称之为合并操作符(Union Operator),用它可以很直观地合并多个字典。
>>> profile = {"name": "xiaoming", "age": 27}>>> ext_info = {"gender": "male"}>>>>>> profile | ext_info{'name': 'xiaoming', 'age': 27, 'gender': 'male'}>>>>>> ext_info | profile{'gender': 'male', 'name': 'xiaoming', 'age': 27}
除了 | 操作符之外,还有另外一个操作符 |=,类似于原地更新。
>>> ext_info |= profile>>> ext_info{'gender': 'male', 'name': 'xiaoming', 'age': 27}>>>>>>>>> profile |= ext_info>>> profile{'name': 'xiaoming', 'age': 27, 'gender': 'male'}
文章来自于:https://www.cnblogs.com/wongbingming/p/12669854.html
4、元祖
# 元祖是不能修改# 只有两个方法,count和index# 元祖里面只有一个值时,需要在值后面加逗号,否则类型是strnames = ('sara', 'john')print(names[0])for name in names:print(name)print(names.count('sara'))print(names.index('john'))names = ('sara',)print(type(names)) # <class 'tuple'>
5、字符串的操作
# 字符不能修改msg = ' abc'msg2 = 'abc\n'msg3 = ' dfdfd dfdfd 'msg4 = 'abc.jpg'new_msg = msg.strip() # 默认去掉字符串两边的空格和换行符# print(msg) # abc# print(new_msg) # abc# print('abc\n'.strip())# print(msg3.rstrip()) # 只去除右边的空格和换行符# print('abc.jpg'.strip('.jpg')) # 如果指定了一个字符串,就去掉指定的字符串words = 'sdffgdsdfdfdfsd'# print(words.count('s')) # 字符串出现的次数# print(words.index('a')) # 如果查询不到,就报错substring not found;查找到的话,返回下标# print(words.find('s')) # 如果查询不到字符串,返回-1;默认不写,从开头开始查找;查找到的话,返回下标# print(words.find('s',5)) # 如果查询不到字符串,返回-1;可以指定从下标为5的地方开始查询s# print(words.replace('sd','SD')) # 替换字符串,默认把所有符合条件的字符串的都替换 SDffgdSDfdfdfSD# print(words.replace('sd','SD',1)) # 替换字符串,默认把所有符合条件的字符串的都替换 SDffgdsdfdfdfsd# print('abc dfgfd'.replace(' ','')) # 替换字符串,默认把所有符合条件的字符串的都替换 SDffgdsdfdfdfsd# print(words.upper()) # SDFFGDSDFDFDFSD# print(words.lower()) # sdffgdsdfdfdfsd# print(words.isdigit()) # 判断字符串里面是否都是整数x# msg.isupper()# print(words.islower()) # 判断字符串里面是否都是小写字母# print(words.isupper()) # 判断字符串里面是否都是大写字母# print('123.jpg'.startswith('123')) # 判断字符串是否以123开头 返回True ,False# print('123.jpg'.endswith('.jpg')) # 判断字符串是否以.jpg结尾 返回True ,False# print(' '.isspace()) # 判断字符串是否是空格# print('Abc'.istitle()) # 字符串首字母是否是大写开头# print('登录结束'.center(30,'*'))# print('!123'.isalnum()) # 字符串如果是字母、数字、中文就返回True,也就是不包含特殊符号# print('67'.isalpha()) # 字符串如果是字母、中文就返回Truenum = input('请输入数字:')print(num.zfill(3)) # 给一个指定的长度,如果长度不够,自动在前面补零
a)split和join
# msg = 'sara,jack,mile'# res = msg.split(',') # 以逗号方式来分割字符串# print(res) # ['sara', 'jack', 'mile']stu = ['sara', 'jack', 'mile']# 如果使用join,前提是list里面的元素必须是字符串;把列表转换成字符串,# print(''.join(stu)) # sarajackmile# print(' '.join(stu)) # sara jack mile# print(','.join(stu)) # sara,jack,mileret = '='.join(stu) # sara,jack,mileprint(ret) # sara=jack=mile
b)字符串练习
s = '''username=a;pwd=123 15934567678username=b;pwd=123 15934567678username=c;pwd=123 15934567678username=d;pwd=123 15934567678username=e;pwd=123 15934567678'''students = {}for line in s.split('\n'):if line.strip():# if line.strip() != '':user_info, phone = line.split()uname, upwd = user_info.split(';')uname_filed, user = uname.split('=')upwd_filed, pwd = upwd.split('=')students['user'] = userstudents['password'] = pwdstudents['phone'] = phoneprint(students)
