1、字符串格式化:
有4中方式可以格式化字符串
import datetime
uname = 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('用户名/密码不能为空')
continue
elif uname.count(uname) == 0:
print('用户名不存在')
continue
index = usernames.index(uname)
password = str(passwords[index])
if uPwd == password:
print('登录成功')
break
else:
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('用户名/密码不能为空')
continue
elif uname.count(uname) == 0:
print('用户名不存在')
continue
for 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'] = 110
stus.setdefault('email', 'abc@qq.com')
# 新增存在的key,setdefault不会修改原始的值,但是dict['name']会
stus['phone'] = 119
stus.setdefault('email', '123@qq.com')
# 删除
# stus.pop('age') # 删除指定的key值
# del stus['age']
# stus.popitem() # 随机删除一个元素
# pprint.pprint(stus, indent=4)
# 其它方法
# stus.clear() # 清空字典
print(stus.values()) # 字典里面所有的value
print(stus.keys()) # 字典里面所有的key
print(stus.items()) # 把字典转成二维数组,二维数组里面的每个元素就是字典的key,value
stu2 = {'money': 1000}
stus.update(stu2) # 把一个字典里面的值,放到另外一个字典里面去;字典的合并
pprint.pprint(stus, indent=4)
b)字典的嵌套
import pprint
info = {
'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'] +=5000000
pprint.pprint(info)
c)字典的练习
import datetime
users = {
"admin":123456,
"test":456789,
"dev":"acb12234"
}
import datetime
today = 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))
break
else:
print("密码错误!")
else:
print("输入错误次数已经达到3次!")
d)字典的循环
d = {'admin': 123456, 'test': 56789}
# 字典的循环
# 第一种方式效率比较高,直接拿着key找value
for k in d:
print(k) # 取的是字典的key admin test
print(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
# 元祖里面只有一个值时,需要在值后面加逗号,否则类型是str
names = ('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()) # 字符串如果是字母、中文就返回True
num = 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,mile
ret = '='.join(stu) # sara,jack,mile
print(ret) # sara=jack=mile
b)字符串练习
s = '''
username=a;pwd=123 15934567678
username=b;pwd=123 15934567678
username=c;pwd=123 15934567678
username=d;pwd=123 15934567678
username=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'] = user
students['password'] = pwd
students['phone'] = phone
print(students)