2.3 Python语言基础
2.3.2.3 字节与Unicode
在现代Python中,Unicode成为字符串类型的一等类,用于更好地兼容处理ASCII和非ASCII文本。在Python的早期版本中,字符串完全是字节,而没有显式的Unicode编码。如果你知道字符的编码,你就可以将其转换为Unicode。
In [26]: val = '王大锤'
In [27]: val_utf8 = val.encode('utf-8')
In [28]: val_utf8
Out[28]: b'\xe7\x8e\x8b\xe5\xa4\xa7\xe9\x94\xa4'
In [29]: val_utf8.decode('utf-8')
Out[29]: '王大锤'
我们也可以不让数据隐式地解码为Unicode字符串,只需要在字符串前加前缀b就可以。但是需要注意的是,默认的编码似乎是ASCII编码,这个编码并不能解析中文。所以如果输入中文的话,就会出错。
In [30]: a = b'王大锤'
File "<ipython-input-30-3b6b035924e5>", line 1
a = b'王大锤'
^
SyntaxError: bytes can only contain ASCII literal characters.
变换为英文字母就可以。
In [33]: a = b'wangdachui'
In [34]: a
Out[34]: b'wangdachui'
In [35]: a.decode('utf8')
Out[35]: 'wangdachui'
2.3.2.5 类型转换
str、bool、int和float既是数据类型,同时也是可以将其他数据转换为这些类型的函数:
In [36]: a = 3.1415926
In [37]: type(a)
Out[37]: float
In [38]: type(str(a))
Out[38]: str
In [39]: int(a)
Out[39]: 3
In [40]: bool(a)
Out[40]: True
2.3.2.6 None
None是Python的null值类型。如果一个函数没有显式地返回值,则它会隐式地返回None:
In [45]: a = None
In [46]: a is None
Out[46]: True
In [47]: b = '马冬梅'
In [48]: b is not None
Out[48]: True
除此之外,None还可以作为一个常用的函数参数默认值:
In [49]: def wangdachui(a,b,c=None):
...: if c == None:
...: d = a + b
...: print(d)
In [50]: wangdachui(1,2)
3
2.3.2.7 日期和时间
Python中内建的datetime模块,提供了datetime、data和time类型。可能正如你想象的,datatime类型是包含日期和时间信息的,最常用的方法是:
In [52]: from datetime import datetime,date,time
In [53]: dt = datetime(2011,10,29,20,30,21)# datetime(年,月,日,时,分,秒)
In [54]: dt.day
Out[54]: 29
In [55]: dt.minute
Out[55]: 30
In [56]: dt.second
Out[56]: 21
In [57]: dt.date()
Out[57]: datetime.date(2011, 10, 29)
In [58]: dt.time()
Out[58]: datetime.time(20, 30, 21)
# strftime方法将datetime转换为字符串
In [60]: dt.strftime('%m/%d/%Y %H:%M')
Out[60]: '10/29/2011 20:30'
# 字符串可以通过strptime转换为datetime对象:
In [62]: datetime.strptime('20091031','%Y%m%d')
Out[62]: datetime.datetime(2009, 10, 31, 0, 0)
当你在聚合或分组时间序列数据时,会常常用到替代datetime时间序列中的一些值,比如将分钟、秒替换为0:
In [63]: dt.replace(minute=0,second=0)
Out[63]: datetime.datetime(2011, 10, 29, 20, 0)
由于datetime.datetime是不可变类型,以上的方法都是产生新的对象。
两个不同的datetime对象会产生一个datetime.timedelta类型的对象:
In [64]: dt2 = datetime(2011,11,15,22,30)
In [65]: dekta = dt2 - dt
In [66]: dekta
Out[66]: datetime.timedelta(days=17, seconds=7179)
In [67]: type(dekta)
Out[67]: datetime.timedelta
输出的timedelta(17,7079)表示时间间隔为17天又7179秒。
将time加到一个datetime上将产生一个新的对象。
In [68]: dt
Out[68]: datetime.datetime(2011, 10, 29, 20, 30, 21)
In [69]: dt + dekta
Out[69]: datetime.datetime(2011, 11, 15, 22, 30)
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
写到这里,B站up主致敬神仔说可以弄一个算命器,我忽然觉得可以。
于是凑活着快写了一个:
from datetime import datetime,date,time
import random
while True:
nian = int(input("输入你的出生年"))
from datetime import datetime,date,time
import random
while True:
nian = int(input("输入你的出生年"))
yue = int(input("输入你的出生月"))
ri = int(input("输入你的出生日"))
dt = date(nian,yue,ri)
dt1 = dt.strftime('%Y-%m-%d')
shichen = input(f"您的出生时间是{dt1}吗?(输入'是'或'否',输入其他任意键结束)")
if shichen == '是':
nian1 = nian + random.randint (1,100 - (2021-nian))
yue1 = yue + random.randint(1,12 - yue)
ri1 = ri +random.randint(1,31 - ri)
dt2 = date(nian1,yue1,ri1)
dt3 = dt2 - dt
print(f'你的单身生涯还将持续{dt3}')
elif shichen == '否':
pass
else:
print('程序结束~')
break
这是弹幕启发的我,说是以前有一个网站,是专门算你还有多少寿命的。我就按照那个思路大概写了一下,因为是快写的,所以很多逻辑不完善,但起码可以粗略玩玩了。
哈哈,还是蛮有意思的。
第二章和第三章的内容是偏基础知识部分,相当于巩固Python基础知识。
所以很多之前在《Python编程》里提到的,或者是已经详细描述的,就略过了。
明天开始第三章的学习~
胭惜雨
2021年03月17日