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日

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据