python基础笔记2:部分数据类型与函数
type 的 type:
a = 1
print(type(type(a)))
s = type(a)
print(f'type = {s}')
# <class 'type'>
# type = <class 'int'> 可见type自身是一种类型,不是str但是可以转化成str
li = [2, '3', 2333, 6.0]
for i in li:
if type(i) == int:
print(i) # 2 2333 函数类型关键字也是type类型的,可直接用于比较
复数
x = complex(3, 2)
y = 4j
y += 1
z = complex(0, 3)
print(x, y, z) # (3+2j) (1+4j) 3j
浮点数
import math
round(0.5) # 0
round(1.5) # 2
round(2.5) # 2
round(3.5) # 4
round(4.5) # 4
round(5.5) # 6
round(6.5) # 6 由于pyhon以浮点类型存储数据,故round函数四舍五入有误差
round(2.5+0.000001) # 3 必须加一个eps才能解决
round(1.35, 1) #1.4 保留小数点后1位
字符串
s = r'a%2b\n%d\n'
for c in s:
print(c, end='') # a%2b\n%d\n 字符串前加r忽视特殊字符
s = u'中文' # unicode
s = b'asdf'
print(type(s)) # <class 'bytes'> 加b转成bytes类型
print(s) # b'asdf'
S = s.decode('utf-8')
print(S) # asdf
s = '中文'
B = s.encode() # bytes类型为str encode后的格式,逆运算是decode解码
print(B) # b'\xe4\xb8\xad\xe6\x96\x87'
age = 18
s = f'age = {age}' # 格式化字符串
ljust 与 rjust 补齐:
print('123'.ljust(6,'L')) # 123LLL
print('123'.rjust(6,'0')) # 000123 补齐前导零
strip():
s = ' qwq \n\n QAQ \n '
print(s.strip())
# qwq
# QAQ strip可以去掉字符串首尾的空格和回车,也可以传参指定字符s.strip('\n')
s = '1213124565432121'
print(s.strip('12'))
# 312456543 也可以去除指定字符串,注意到三点:1、末尾倒序;2、中间不会去掉;3、匹配一半也会删除
s = '0010100819200'
print(s.lstrip('0'))
# 10100819200 去除前导零,用lstrip
split():
s = '1234 23 ;;;2 .2. 23. df'
li = s.split()
print(li) # ['1234', '23', ';;;2', '.2.', '23.', 'df']
# split是str类的方法,返回值为list,默认是按空格和回车切割好的字符串,也可以指定切割的字符(或字符串)
li2 = s.split('.')
print(li2) # ['1234 23 ;;;2 ', '2', ' 23', ' df'] 注意:默认的分割方式会删去空字符串,而自定义不会
# 第二个参数是分割几次:剩余的未分割完的字符串会整个塞入list
想要同时用' '和'.'来分割? 需要用re库里的split实现扩展功能:
s = '23. .2.1'
fu = [' ', '.']
num_list = re.split(f'{fu}',s)
print(num_list) # ['23', '', '', '2', '2']
提取文件中所有数字:
文本读取:
with open(r'1.txt', 'r') as file:
all = file.read() # all 是一个str,包含'\n'
lines = file.readlines() # lines 是一个list,元素为每行字符串(末尾都是'\n')
# 注:read是不能重复读的,两个只能写一个,这个写法lines是空的
lines = all.split('\n') # 其实可以用split把它俩联系起来,区别在于此时的lines元素末尾没有了'\n'
言归正传:
with open(r".\1.txt") as file:
all = file.read()
s = ''
for c in all:
if c<'0' or c>'9': # 冗余字符全替换为空格
s += ' '
else:
s += c
s_list = s.split(' ')
num_list = []
for n in s_list:
if n != '': # 判断空字符串
num_list.append(int(n)) # 转成int,可以自动去除前导零
print(num_list)
# 这个程序只能分割所有非负整数,带负号和小数点无法处理,需要自行对字符串进行判断
sort & sorted
sort()函数只有list类型才有,返回值为None,是将list内部排序的void函数,可传参:reverse。
sorted() 传参可以是任意iterable,不改变原iterable,返回值恒定为排好的list
a = [1, 3, 6, 2, 4]
a.sort(reverse=True)
print(a) # [6, 4, 3, 2, 1]
s = 'asdf'
z = sorted(s)
print(s,z) # asdf ['a', 'd', 'f', 's']
字典排序:
dic = {'c': 4, 'a': 5, 'd': 1, 'b': 2}
li1 = sorted(dic)
print(li1) # ['a', 'b', 'c', 'd'] 直接排序是只对键排序
li2 = sorted(dic.items())
print(li2) # [('a', 5), ('b', 2), ('c', 4), ('d', 1)] # 转化为元组排序,默认按第一关键字
li3 = sorted(dic.items(), key=lambda x: x[1], reverse=True)
print(li3) # [('a', 5), ('c', 4), ('b', 2), ('d', 1)] 根据第二关键字排序
python2中sorted可以传四个参数:sorted(iterable, cmp, key, reverse)
python3中却缩减到了三个参数:sorted(iterable, key, reverse)
在C++中习惯用cmp进行sort的话会感到很不舒服,不过我们可以用functools库中的cmp_to_key来实现cmp转key。
有了这个函数,我们的key值就可以随心所欲地定义了:
from functools import cmp_to_key
dic = {'e': 4, 'a': 5, 'd': 1, 'b': 2, 'c': 4}
def cmp1(x, y): # 可以实现先按第二关键字排序再按第一关键字排序
if x[1] != y[1]:
return -1 if x[1] < y[1] else 1
else:
return -1 if x[0] < y[0] else 1
li4 = sorted(dic.items(), key=cmp_to_key(cmp1))
print(li4) #[('d', 1), ('b', 2), ('c', 4), ('e', 4), ('a', 5)]