从零开始学习python

利用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模块常用datetimetimedelta类,也提供了datetime类。共同点在于二者都是从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)

内建序列函数

  1. enumerate

    返回序列中元素及其索引值

  2. sorted

  3. zip

    将列表、元组与其他元素配对,新建一个元组构成的列表

  4. reversed

    将序列元素倒序排列的生成器

字典

由键值对构成的集合

  1. 使用pop方法或者del方法

    同:都是指定键然后删除值

    异:前者会返回被删除的值,并删除键

  2. keys方法和values方法

    提供字典键、值的迭代器

  3. update方法

    update方法改变字典中元素位置,对于原字典中已经存在的键,如果update数据中含有相同的键,则会覆盖原值

  4. 默认值

    字典的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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!