Python3 CookBook学习笔记 -- 数字日期和时间

1. 浮点数的四舍五入

round(value, ndigits),能够解决浮点数的四舍五入,但是仍然需要注意区别。

>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(-1.27, 1)
-1.3
>>> round(1.25361,3)
1.254
>>>

当一个值刚好在两个边界的中间的时候, round 函数返回离它最近的偶数。 也就是说,对1.5或者2.5的舍入运算都会得到2。

>>> round(1.5)
2
>>> 
>>> round(2.5)
2

当精度为负数时:

>>> a = 1627731
>>> round(a, -1)
1627730
>>> 
>>> round(a, -2)
1627700
>>> 
>>> round(a, -3)
1628000

2. 执行精确的浮点数运算

我们在运算时经常会出现以下情况。

>>> a = 4.2
>>> b=2.1
>>> a+b
6.300000000000001
>>> (a+b) == 6.3
False

所以我们为了精确,可以使用 decimal 模块:

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True

3. 数字的格式化输出

再格式化单个数字时,我们会和字符串一样,使用 format() 函数:

当指定数字的位数后,结果值会根据 round() 函数同样的规则进行四舍五入后返回

>>> x = 1234.56789
>>> 到小数点后两位
>>> format(x, '0.2f')
'1234.57'
>>> 
>>> 右对齐
>>> format(x, '>10.1f')
'    1234.6'
>>> 
>>> 使用#补齐
>>> format(x, '#>10.1f')
'####1234.6'
>>> 
>>> 左对齐
>>> format(x, '<10.1f')
'1234.6    '
>>> 
>>> 居中
>>> format(x, '^10.1f')
'  1234.6  '

>>> 千位分离器
>>> x = 123456789.12345
>>> 
>>> format(x, ',')
'123,456,789.12345'
>>>
>>> format(x, '0,.1f')
'123,456,789.1'

指数计法:

format(x, 'e')
>>> format(x, 'e')
'1.234568e+03'
>>> format(x, '0.2E')
'1.23E+03'

字符串中插入变量

>>> x = 1234.56789
>>>
>>> 'The value is {:0,.2f}'.format(x)
'The value is 1,234.57'

4. 二八十六进制整数

整数转换为二进制、八进制或十六进制的文本串, 可以分别使用 bin() , oct()hex() 函数:

>>> x=1234
>>> bin(x)
'0b10011010010'
>>> 
>>> oct(x)
'0o2322'
>>> 
>>> hex(x)
'0x4d2'
>>> 
>>> x=-1234
>>> bin(x)
'-0b10011010010'
>>> 
>>> oct(x)
'-0o2322'
>>> 
>>> hex(x)
'-0x4d2'

另外,如果你不想输出 0b , 0o 或者 0x 的前缀的话,请使用 format() 函数。比如:

>>> x=1234
>>> format(x, 'b')
'10011010010'
>>> format(x, 'o')
'2322'
>>> format(x, 'x')
'4d2'
>>> 
>>> x = -1234
>>> format(x, 'b')
'-10011010010'
>>> format(x, 'x')
'-4d2'

各进制转化

>>> int('4d2', 16)
1234
>>> int('10011010010', 2)
1234
>>> int('0o2322', 8)
1234

5. 无穷大与NaN

你想创建或测试正无穷、负无穷或NaN(非数字)的浮点数。

>>> a = float('inf')
>>> b = float('-inf')
>>> c = float('nan')
>>> a
inf
>>> b
-inf
>>> c
nan
>>>

为了测试这些值的存在,使用 math.isinf()math.isnan() 函数。比如:

>>> math.isinf(a)
True
>>> math.isnan(c)
True

6. 随机选择

random 模块有大量的函数用来产生随机数和随机选择元素。

要想从一个序列中随机的抽取一个元素,可以使用 random.choice():

>>> import random
>>> values = [1, 2, 3, 4, 5, 6]
>>>  
>>> random.choice(values)
>>> 2

提取出N个不同元素的样本用来做进一步的操作,可以使用 random.sample() :

>>> random.sample(values,2)
[2, 5]

打乱序列中元素的顺序,可以使用 random.shuffle() :

>>> random.shuffle(values)
>>> values
[4, 3, 2, 6, 1, 5]
>>> 
>>> random.shuffle(values)
>>> values
[6, 3, 4, 1, 2, 5]

生成随机整数,请使用 random.randint()

>>> random.randint(0,10)
6

7. 基本的日期与时间转换

获取当前时间

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2018, 2, 23, 17, 8, 36, 311740)
>>>  
>>> datetime.today()
datetime.datetime(2018, 2, 23, 17, 8, 42, 232123)
>>> 
>>> today=datetime.today()
>>> print(today)
2018-02-23 17:09:06.168817
>>> 
>>> now=datetime.now()
>>> print(now)
2018-02-23 17:09:17.158419
>>> now.day
23 
>>> now.year
2018
>>> now.month
2
>>> now.hour
17
>>> now.minute
9
>>> now.second
17

两个日期的比较

>>> from datetime import timedelta
>>> a = datetime(2012, 9, 23)
>>> b = datetime(2013, 9, 23)
>>> a < b
True
>>> 
>>> (a + timedelta(days=365))  == b
True
>>> type(b-a)
<class 'datetime.timedelta'>
>>> (b-a).days
365

获取当前月份的第一天

>>> from datetime import date
>>> date.today().replace(day=1)
datetime.date(2018, 2, 1)

获取本月的最后一天

>>> from datetime import date
>>> import calendar
>>> firstDay=date.today().replace(day=1)
>>> calendar.monthrange(firstDay.year, firstDay.month)[1]
28

8. 字符串转换为日期

>>> text = '2012-09-20'
>>> y = datetime.strptime(text, '%Y-%m-%d')
>>>  
>>> z= datetime.now()
>>> 
>>> z - y
datetime.timedelta(1982, 62661, 581312)

另一种格式化

>>> nice_z = datetime.strftime(z, '%A %B %d, %Y')
>>> nice_z
'Sunday September 23, 2012'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容