查看原文
其他

【翻译】《利用Python进行数据分析·第2版》第2章(下)Python语法基础,IPython和Jupyter

2018-03-10 SeanCheney Python爱好者社区

作者:SeanCheney   Python爱好者社区专栏作者

简书专栏:https://www.jianshu.com/u/130f76596b02


前文传送门:

【翻译】《利用Python进行数据分析·第2版》第1章 准备工作

【翻译】《利用Python进行数据分析·第2版》第2章(上)Python语法基础,IPython和Jupyter

【翻译】《利用Python进行数据分析·第2版》第2章(中)Python语法基础,IPython和Jupyter


字节和Unicode


在Python 3及以上版本中,Unicode是一级的字符串类型,这样可以更一致的处理ASCII和Non-ASCII文本。在老的Python版本中,字符串都是字节,不使用Unicode编码。假如知道字符编码,可以将其转化为Unicode。看一个例子:


In [76]: val = "español" In [77]: val Out[77]: 'español'


可以用encode将这个Unicode字符串编码为UTF-8:


In [78]: val_utf8 = val.encode('utf-8') In [79]: val_utf8 Out[79]: b'espa\xc3\xb1ol' In [80]: type(val_utf8) Out[80]: bytes


如果你知道一个字节对象的Unicode编码,用decode方法可以解码:


In [81]: val_utf8.decode('utf-8') Out[81]: 'español'


虽然UTF-8编码已经变成主流,,但因为历史的原因,你仍然可能碰到其它编码的数据:


In [82]: val.encode('latin1') Out[82]: b'espa\xf1ol' In [83]: val.encode('utf-16') Out[83]: b'\xff\xfee\x00s\x00p\x00a\x00\xf1\x00o\x00l\x00' In [84]: val.encode('utf-16le') Out[84]: b'e\x00s\x00p\x00a\x00\xf1\x00o\x00l\x00'


工作中碰到的文件很多都是字节对象,盲目地将所有数据编码为Unicode是不可取的。


虽然用的不多,你可以在字节文本的前面加上一个b:


In [85]: bytes_val = b'this is bytes' In [86]: bytes_val Out[86]: b'this is bytes' In [87]: decoded = bytes_val.decode('utf8') In [88]: decoded  # this is str (Unicode) now Out[88]: 'this is bytes'


布尔值


Python中的布尔值有两个,True和False。比较和其它条件表达式可以用True和False判断。布尔值可以与and和or结合使用:


In [89]: True and True Out[89]: True In [90]: False or True Out[90]: True


类型转换


str、bool、int和float也是函数,可以用来转换类型:


In [91]: s = '3.14159' In [92]: fval = float(s) In [93]: type(fval) Out[93]: float In [94]: int(fval) Out[94]: 3 In [95]: bool(fval) Out[95]: True In [96]: bool(0) Out[96]: False


None


None是Python的空值类型。如果一个函数没有明确的返回值,就会默认返回None:


In [97]: a = None In [98]: a is None Out[98]: True In [99]: b = 5 In [100]: b is not None Out[100]: True


None也常常作为函数的默认参数:


def add_and_maybe_multiply(a, b, c=None):    result = a + b    if c is not None:        result = result * c    return result


另外,None不仅是一个保留字,还是唯一的NoneType的实例:


In [101]: type(None) Out[101]: NoneType


日期和时间


Python内建的datetime模块提供了datetimedatetime类型。datetime类型结合了datetime,是最常使用的:


In [102]: from datetime import datetime, date, time In [103]: dt = datetime(2011, 10, 29, 20, 30, 21) In [104]: dt.day Out[104]: 29 In [105]: dt.minute Out[105]: 30


根据datetime实例,你可以用datetime提取出各自的对象:


In [106]: dt.date() Out[106]: datetime.date(2011, 10, 29) In [107]: dt.time() Out[107]: datetime.time(20, 30, 21)


strftime方法可以将datetime格式化为字符串:


In [108]: dt.strftime('%m/%d/%Y %H:%M') Out[108]: '10/29/2011 20:30'


strptime可以将字符串转换成datetime对象:


In [109]: datetime.strptime('20091031', '%Y%m%d') Out[109]: datetime.datetime(2009, 10, 31, 0, 0)


表2-5列出了所有的格式化命令。


表2-5 Datetime格式化指令(与ISO C89兼容)


当你聚类或对时间序列进行分组,替换datetimes的time字段有时会很有用。例如,用0替换分和秒:


In [110]: dt.replace(minute=0, second=0) Out[110]: datetime.datetime(2011, 10, 29, 20, 0)


因为datetime.datetime是不可变类型,上面的方法会产生新的对象。


两个datetime对象的差会产生一个datetime.timedelta类型:


In [111]: dt2 = datetime(2011, 11, 15, 22, 30) In [112]: delta = dt2 - dt In [113]: delta Out[113]: datetime.timedelta(17, 7179) In [114]: type(delta) Out[114]: datetime.timedelta


结果timedelta(17, 7179)指明了timedelta将17天、7179秒的编码方式。


timedelta添加到datetime,会产生一个新的偏移datetime


In [115]: dt Out[115]: datetime.datetime(2011, 10, 29, 20, 30, 21) In [116]: dt + delta Out[116]: datetime.datetime(2011, 11, 15, 22, 30)


控制流


Python有若干内建的关键字进行条件逻辑、循环和其它控制流操作。


if、elif和else


if是最广为人知的控制流语句。它检查一个条件,如果为True,就执行后面的语句:


if x < 0:    print('It's negative')


if后面可以跟一个或多个elif,所有条件都是False时,还可以添加一个else


if x < 0:    print('It's negative') elif x == 0:    print('Equal to zero') elif 0 < x < 5:    print('Positive but smaller than 5') else:    print('Positive and larger than or equal to 5')


如果某个条件为True,后面的elif就不会被执行。当使用and和or时,复合条件语句是从左到右执行:


In [117]: a = 5; b = 7 In [118]: c = 8; d = 4 In [119]: if a < b or c > d:   .....:     print('Made it') Made it


在这个例子中,c > d不会被执行,因为第一个比较是True


也可以把比较式串在一起:


In [120]: 4 > 3 > 2 > 1 Out[120]: True


for循环


for循环是在一个集合(列表或元组)中进行迭代,或者就是一个迭代器。for循环的标准语法是:


for value in collection:    # do something with value


你可以用continue使for循环提前,跳过剩下的部分。看下面这个例子,将一个列表中的整数相加,跳过None:


sequence = [1, 2, None, 4, None, 5] total = 0 for value in sequence:    if value is None:        continue    total += value


可以用break跳出for循环。下面的代码将各元素相加,直到遇到5:


sequence = [1, 2, 0, 4, 6, 5, 2, 1] total_until_5 = 0 for value in sequence:    if value == 5:        break    total_until_5 += value


break只中断for循环的最内层,其余的for循环仍会运行:


In [121]: for i in range(4):   .....:     for j in range(4):   .....:         if j > i:   .....:             break   .....:         print((i, j))   .....: (0, 0) (1, 0) (1, 1) (2, 0) (2, 1) (2, 2) (3, 0) (3, 1) (3, 2) (3, 3)


如果集合或迭代器中的元素序列(元组或列表),可以用for循环将其方便地拆分成变量:


for a, b, c in iterator:    # do something


While循环


while循环指定了条件和代码,当条件为False或用break退出循环,代码才会退出:


x = 256 total = 0 while x > 0:    if total > 500:        break    total += x    x = x // 2


pass


pass是Python中的非操作语句。代码块不需要任何动作时可以使用(作为未执行代码的占位符);因为Python需要使用空白字符划定代码块,所以需要pass:


if x < 0:    print('negative!') elif x == 0:    # TODO: put something smart here    pass else:    print('positive!')


range


range函数返回一个迭代器,它产生一个均匀分布的整数序列:


In [122]: range(10) Out[122]: range(0, 10) In [123]: list(range(10)) Out[123]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range的三个参数是(起点,终点,步进):


range的三个参数是(起点,终点,步进):


In [124]: list(range(0, 20, 2)) Out[124]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] In [125]: list(range(5, 0, -1)) Out[125]: [5, 4, 3, 2, 1]


可以看到,range产生的整数不包括终点。range的常见用法是用序号迭代序列:


seq = [1, 2, 3, 4] for i in range(len(seq)):    val = seq[i]


可以使用list来存储range在其他数据结构中生成的所有整数,默认的迭代器形式通常是你想要的。下面的代码对0到99999中3或5的倍数求和:


sum = 0 for i in range(100000):    # % is the modulo operator    if i % 3 == 0 or i % 5 == 0:        sum += i


虽然range可以产生任意大的数,但任意时刻耗用的内存却很小。


三元表达式


Python中的三元表达式可以将if-else语句放到一行里。语法如下:

value = true-expr if condition else false-expr


true-exprfalse-expr可以是任何Python代码。它和下面的代码效果相同:


if condition:    value = true-expr else:    value = false-expr


下面是一个更具体的例子:


In [126]: x = 5 In [127]: 'Non-negative' if x >= 0 else 'Negative' Out[127]: 'Non-negative'


和if-else一样,只有一个表达式会被执行。因此,三元表达式中的if和else可以包含大量的计算,但只有True的分支会被执行。


虽然使用三元表达式可以压缩代码,但会降低代码可读性。


赞赏作者

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存