利用python进行数据分析(一)
在第二次阅读利用python进行数据分析
时,相较上次许多疑惑之处茅塞顿开,故开此专题用以记录学习情况。希望能做到每天一更。
参考用书:利用python进行数据分析
python版本:python3.6以上
开发环境:jupyter lab=2.2.0a1(为了适用Jupyter lab的kite插件而适用的测试版本)
文章分为两部分:第一部分是python语言基础;第二部分是python内建数据结构、函数及文件
1.python语言基础
强类型语言、动态类型语言
python被认为是强类型语言(在强类型中,不管在编译时还是运行时,一旦某个类型赋值给某个变量,它会持有这个类型,并且不能同其他类型在计算某个表达式时混合计算。python对象在大多数时候都有指定类型,且对象在运行阶段执行类型检查,只在特定时候进行隐式转换)
isinstance函数可以检查对象是否是特定类型,可以传入包含数据类型的元组
a = 5
isinstance(a, (int, float))
属性和方法
python中的对象常常会有属性(**Python对象“内部”存储的其他对象)和方法(与对象相关的函数)。如下,生成一个字符串对象a,按下Tab
有如下方法/属性。可以直接适用obj.attribute_name来调用,或者可以通过getattr以及相关的hasattr和setattr函数
python中的标量类型
常见的标量类型有:None、str、bytes、float、bool、int。
-
字符串
python中字符串是不可变的,无法修改;如果在字符串中有特殊符号需要转义时,可以在符号前加反斜杠或者在字符串前面加前缀符号r(r即raw,表示原生)
s = '12\34'
s = r'1234'字符串格式化:有以下三种方法
# 最经典的%格式化方法:%s %d %f
print('%.2f %s are worth US$%d' %(4.5560, 'Argentine Pesos', 1))
# python2.7之后通用的format方法(括号部分可省略)
print('{0:.2f} {1:s} are worth US${3:d}'.format(4.5560, 'Argentine Pesos', 1))
# python3.6之后的f-string方法
print(f'{4.5560:.2f} {"Argentine Pesos"} are worth US${1}')# 输出结果为:输出两位小数,输出字符串,输出数字
'4.56 Argentine Pesos are worth US$1' -
字节与unicode
在Python 3.0及以上中,Unicode成为字符串类型的一等类,可以使用encode方法将Unicode字符串转化为UTF-8字节,当然如果已经知道字节对象的Unicode编码,则可以使用decode方法进行解码。
-
None
`None`不仅是关键字,还是NoneType类型的唯一实例 -
日期和时间
Python中的日期可包括两类:time模块提供struct_time类, 即(time tuple, p_tuple, 时间元组),datetime模块常用datetime和timedelta类,也提供了date、time类。共同点在于二者都是从1970年1月1日0时0分开始计数,可以使用相关方法转化成我们日常生活中的’xxxx年-xx月-xx日 xx:xx:xx’(str格式)
image-20200703141153903 同时,两者也都提供了strptime方法,将字符串转化为相应对象。
image-20200703142215560 两个不同的datetime对象会得到一个datetime.timedelta对象
import datetime
dt = datetime.datetime(2011, 10, 29, 20, 30, 21)
dt2 = datetime.datetime(2011, 11, 15, 22, 30)
delta = dt2 - dt
# delta:datetime.timedelta(days=17, seconds=7179)表示时间间隔为17天又7179秒 -
控制流
-
if、elif和else
当使用and和or进行混合条件判断时,按照从左往右的顺序并且在and或or两侧条件会有**”短路”**现像。
a = 5; b =7
c = 8; d = 4
if a < b or c > d:
print('Made it')
# 在本例中,c > d是不会判断的,因为第一个比较判断的值已经是Truel了,右侧条件短路; -
for 循环
break
关键字结束最内层的一次for循环, 而continue则是跳过之后的代码进行下一侧循环 -
三元表达式
有时可以使用三元表达式将一个if-else代码块联合起来
x = 5
y = 'None-negative' of X >= 0 else 'Negative'
2.python内建数据结构、函数及文件
元组
如果元组中含有可变对象,例如列表,则可以在元组的该对象中修改。
列表
列表增加元素的两种方法:insert与append。前者计算代价更高,因为子序列元素需要在内部移动而为新元素提供空间。
在使用in/not in对列表元素进行检查时,使用的是线性逐个扫描的方法,而字典和集合是同时检查所有元素(基于哈希表)
sort/sorted:前者对已有列表进行排序操作,而后者是新建排序列表
bisect模块:可以搜索元素应当被插入的位置(bisect.bisect),并插入相应位置(bisect.insort)
内建序列函数
-
enumerate
返回序列中元素及其索引值
-
sorted
-
zip
将列表、元组与其他元素配对,新建一个元组构成的列表
-
reversed
将序列元素倒序排列的生成器
字典
由键值对构成的集合
-
使用pop方法或者del方法
同:都是指定键然后删除值
异:前者会返回被删除的值,并删除键
-
keys方法和values方法
提供字典键、值的迭代器
-
update方法
update方法改变字典中元素位置,对于原字典中已经存在的键,如果update数据中含有相同的键,则会覆盖原值。
-
默认值
字典的get方法可以设置默认值
dict1 = {'a': 'some value', 'b': [1, 2, 3, 4]}
dict2 = {'a': 'some value', 'b': [1, 2, 3, 4], 'c': 0.1}
# 1.通过get设置默认值,如果key不在字典中,则返回默认值,否则将键对应的值更改为设置的默认值
value1 = dict1.get('c', 1)
value2 = dict2.get('c', 1)
print(value1, dict1)
print(value2, dict2)
# 2.字典中的值集合通过设置成为另一种集合
# 例:将words中的元素按照首字母分类为包含列表的字典
words = ['apple', 'bat', 'bar','atom', 'book']
by_letter = {}
for word in words:
letter = word[0]
if letter not in by_letter:
by_letter[letter] = [word]
else:
by_letter[letter].append(word)
print(by_letter)
# 使用字典的setdefault方法
by_letter = {}
for word in words:
letter = word[0]
by_letter.setdefault(letter, []).append(word)
print(by_letter)
# 使用collections模块中的defaultdict类
from collections import defaultdict
by_letter = defaultdict(list)
for word in words:
by_letter[word[0]].append(word)
print(by_letter)# 输出结果
1 {'a': 'some value', 'b': [1, 2, 3, 4]}
0.1 {'a': 'some value', 'b': [1, 2, 3, 4], 'c': 0.1}
{'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
{'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
defaultdict(<class 'list'>, {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']})
列表、集合和字典的推导式
列表推导式:[exp for val in collection if condition]、[exp1 if condition else exp2 for val in collection](下同)
字典推导式:{key-expr: value-expr for value in collection if condition}
集合推导式:{exp for val in collection if condition}
函数
如果python达到函数尾部而没有遇到return语句,则在调用时会自动返回None
函数内部的变量都是默认分配到本地命名空间,该空间在函数调用时生成,由函数填充,函数执行完后,本地命名空间就会被销毁。
Lambda函数
与def关键字声明的函数不同,匿名函数对象自身并没有一个显式的__name__属性,所以也被称为匿名函数。
生成器和迭代器
迭代器协议:是一种令对象可遍历的通用方式。
迭代器就是一种用于上下文中(比如for循环)向python解释器生成对象的对象。在对列表或字典进行循环遍历时,python解释器首先会尝试生成一个迭代器(iter(collection)),大多数以列表为参数的方法都可以接受任意的迭代器对象
生成器是构造新的可便利对象的方法。在执行时“惰性”地返回一个多结果序列,在每一个元素产生之后暂停,直至下一个请求。生成器的创建方法有两种:yield关键字以及生成器表达式
文件读取
可以使用sys模块中的getdefaultencoding方法来检查文件的默认编码。
read方法可以通过设置读取的字节数来推进文件句柄的位置;
tell方法可以给出句柄当前位置;
seek方法可以将句柄位置改变到文件中特定字节
原文始发于微信公众号(多肉罗罗):从零开始学习python
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/186414.html