首页 > 编程语言 >[读书]-像计算机一样 思考python

[读书]-像计算机一样 思考python

时间:2024-05-08 21:11:48浏览次数:19  
标签:函数 tuple python 列表 序列 读书 思考 字符串 字典

目录

前述

编程语言由什么构成?

  • 编程语言是用来操作数据完成特定任务的。
  • 最基本的元素就是数据。数据以数、字符为基本单位。有一阶单位构成int、long、float、string等二阶类型;由基本类型叠加 数据结构构成高阶类型
  • 操作数据:
    • 变量:数据的命名
    • 操作符:数据组合方式
    • 表达式:由数值、变量、操作符构成,最为基本的数据变换单元
    • 语句:表示一个命令和动作的代码,由表达式、基本表示动作的符号构成
    • 函数:完成某一个具体功能的代码块,函数由语句构成

第二章:变量、表达式、和语句

  • 变量名:由字母、数字、下划线构成,但是必须以字母开头
  • 表达式是 数值、变量、操作符的集合
  • 字符串在python可以进行 + 和 的操作,+ 表示 两个字符串相加;表示字符串重复

第三章:函数

  • 函数:进行某种计算的一系列语句的有名称的组合

  • type函数 输入数据、返回数据类型

  • 类型转化函数

    • int 函数将浮点型转化为 int
    • float函数 将其他类型转化为float
    • str将输入转化为字符串类型
  • 数学模块math

    • 模块对象包含了该模型中定义的函数和变量,如果要同时指定模块名称和函数名称,用一个句点(.)分割。这个格式称之为句点表示法
    • 倒入方法
      • import os # 导入整个模块

      • from collections import Iterable,Iterator # 导入一个模块中的某些函数或者全量参数

      • 导入自定义的模块,需要加入 该模块的路径

        • sys.path.append(模块路径)
  • 函数:

    • 函数由def 关键字、函数名、函数体、函数头、返回数值构成

    • 函数命名方式 和 函数体一样

    • 关键词参数:即调用函数的时候,可以加上形参的名称 ex: f(bob,n=7,lenght=0)

    • 变量和形参是局部的

    • 有返回数值的函数:

    • 无返回数值的函数:总是返回None的函数,如 list中sort函数

      ## 1、type函数的类型是什么?函数的类型是什么?id函数类型是什么?
      >>> type(type)
      <class 'type'>
      >>>
      >>> type(id)
      <class 'builtin_function_or_method’>
      >>> type(int)
      <class 'type’>
      >>> type(float)
      <class 'type'>
      
      # 函数
      >>> def f():
      ...     print("hello wolrd")
      ...
      >>> f
      <function f at 0x100d94598>
      >>> f()
      hello wolrd
      

第五章:条件和递归

  • 本章主要介绍if语句 以及 和 if 直接相关的操作符

  • 向下取整除法操作符、 求模操作符、余数操作符

    • 向下取整操作符(//) 对 两个数进行除法操作,并向下取整得到一个整数
    • 求模操作操作符 (%) 将两个数相除,得到余数
  • 布尔表达式:输出true和false的表达式

    • 涉及关系操作符,关系操作符的输出为 布尔数值
      • x != y
      • x > y 或者 x >= y 或者 x < y 或者 x <=y
  • 逻辑操作符

    • and 、or、not
  • 条件执行

    • 单条件
      • if …. else
    • 多条件
      • if… elif…else
    • 调价嵌套
  • 递归的优点在于 描述问题,可以清楚的描述一个问题,对编程而言,不在于解决问题

  • 键盘输入:raw_input

    >>> a=5
    >>> if a > 2:
    ...    print('a>2')
    ... elif a > 3:
    ...    print('a>3')
    ... else:
    ...    print('a>2')
    …
    a>2
    

第六章:有返回数值的函数

  • 函数调用会产生一个返回数值,我们一般将其赋值给一个变量或者用作表达式的组成部分
  • 函数无返回数值的时候,返回的是None。注意None 和 字符串’None’的区别
  • 增量开发:目标是每次只增加和测试一小段代码,来避免长时间的调试过程。增量开发关键点:
    • 以一个正确运行的程序开始,每次只做小的增量修改。如果在任意时刻发现错误,可以立刻定位错在哪里
    • 使用临时变量保存计算的中间结果,你可以显示和打印它们
    • 一旦整个程序完成。一般上需要删除某些辅助调试的代码。删除多少、删不删除需要仔细权衡
  • 布尔函数:函数返回数值为bool的函数

第七章: 迭代

  • 迭代两种:for循环 、while循环。无until…do…语句

  • break 和 continue

    • break 跳出循环: 只能跳出一次循环
    • continue:跳出本次循环

第八章:字符串

  • 字符串是一个序列,即其是 一个由其他值构成的有序的集合。故其他 整型、浮点数、布尔类型都不相同
  • 字符串是一个字符的序列,可以通过下标 进行取值(index),下标从0开始
  • 使用len(str)获取字符串的长度
  • 使用for遍历字符串
  • 字符串可以使用切片操作 取一个子字符串ex str[0:3]
  • 字符串是不可变类型的,即不可以对一个已经存在的字符串进行修改
  • 判断一个字符 是否在 一个字符串中,使用操作符 in
  • 字符串比较:使用 == 比较两个字符串是否相等

第十章:列表

  • 列表是一个序列。字符串是字符的序列,列表是值的序列。列表中的数值可以是任何类型

  • 创建列表:

    • 使用方括号[]
    • 将字符串转化为 list需要使用list
  • 列表是可变的,即列表元素可以处在赋值操作符的左侧,可以通过赋值改变列表 ex: a[1]=2

  • 下标取数

    • 只要数据类型是序列类型都可以使用下标取数
    • 如果下标是负数,那就从列表的结尾开始访问
    • 通过下标访问一个并不存在的元素,会得到IndexError
  • 列表遍历

    • 使用for循环遍历;如果需要使用下标,则使用for循环 + range(len(list))
  • 列表操作

    • + 操作符 可以 拼接列表
    • * 操作符 可以重复一个列表多次
    • 需要注意:+ 和 * 的操作都是创建了一个新的列表而不是 在原有列表上进行增加/删除操作
    • 判断一个列表是否是新建还是在已有列表上修改,本质是看内存地址是否改变
  • 列表是序列,故也可以使用 切片操作

  • 列表方法:列表是一个类,下面即是该类提供的方法,都是原位修改,并不修改列表

    • append: 接受一个元素,在列表尾增加新元素
    • extend:接受一个列表A,将A中所有元素增加到 源列表中,注意和 + 的区别
    • pop: 接受一个index,删除index所在元素,return 该元素的数值;如果不输入任何参数,则index默认数值为-1,会删除并返回最后一个元素
    • 如果知道待删除的元素的数值,则使用remove,其返回数值 为None
    • 如果需要删除多个元素,则可以使用del + 切片下标 ex:del a[0:5] 注意只是修改list不是新建list
    • sort 方法:将列表元素 从高到低重新排序 返回数值为None
  • 对象和数值

    • python中一切皆对象,对象 有 数值(value)
    • 对象的改变意味着 其内存地址的改变
    • 对一个具体的对象可以新建多个引用,引用也称之为别名
    • 两个对相等,意味着其value是相等的(equivalent);两个对象 相同,意味着 两个对象指的是同一个地址。
    • A is B 判断两个引用是否是一个对象;A = B 判断A和B的元素数值是否相同
  • 列表是可变类型,故作为函数参数的时候,函数内部如果对列表进行了修改,是会反映到 调用程序中的,这个是错误的源泉

    • 所以区分哪些操作是新建列表,那些操作是修改列表 至关重要
  • 列表调试 易犯错误

    • 大部分的列表方法 都秀修改参数,并且返回None;这和字符串的方法正好相反,字符串方法新建一个字符串,并保留着原始的字符串不变

    • 选择一种风格,并坚持不变,列表的修改操作有太多种方法,所以也有太多可以出错的可能,只使用一种方式可以降低出错的可能,降至心智负担

    • 通过赋值 来避免别名

      • 对列表进行排序,又不想修改原始列表,那么就使用sorted ,其会返回一个排序好的列表
      • 或者 将原列表进行复制,再进行修改
      >>> a=[1,2]
      >>> id(a)
      4312517320
      >>> a=a+a
      >>> id(a)
      4310309448
      >>> b=a*3
      >>> id(b)
      4312517320
      ## extend 是列表进行修改 + 是对列表进行新建
      >>> a=[1,2]
      >>> id(a)
      4312458568
      >>> a.extend(a)
      >>> a
      [1, 2, 1, 2]
      >>> id(a)
      4312458568	
      
      # is 和  == 的区别
      >>> id(a)
      4312458568
      >>> b=a
      >>> a is b
      True
      >>> id(b)
      4312458568
      >>> id(a)
      4312458568
      >>> import copy
      >>> c=copy.copy(a)
      >>> id(c)
      4312458056
      >>> c == a
      True
      >>> c is a
      False
      

    第十一章:词典

    • 字典类似于列表。但是在列表中,下标是整数;而在字典中,下标可以是任何类型

    • 字典由 key的集合和value的集合构成,并且字典构建了key 和value之间的映射关系,这种关系使得我们可以以O(1)的复杂度,从字典中取数

    • 字典的底层是 hash表,cpython中的字典实现 应该是 哈希表中最简单的那种方法

    • 新建字典

      • 使用a=dict() 或者a={}构建空字典;而后使用 a[‘1’]= 2 添加元素
      • 直接方法:e=
    • 获取字典的key的集合、value的集合、键-值对的集合。假设字典名字为a

      • a.keys(): 返回 key的集合

      • a.values(): 返回values的集合

      • a.items(): 返回所有 键-值对的集合

      • 注意:python2中 上面三个函数返回的是 list;而python3中不是,不知道是什么类型。python3不希望用户直接操作着几个函数的返回数值

        • 可以使用list 转化为list
        • for循环 + in操作符,提取出values
      • 批:我总觉得这个跟迭代器有关系) 上述三个返回全部是 可迭代对象Iterable isinstance(a.iterms(),Iterable)

    • 字典遍历

      • 使用for 循环遍历
    • 字典操作

      • 使用下标取数 ex: a[‘a’],如果不存在,则会返回KeyError
      • 使用in 判断一个数值是不是 字典中键key,(注意这里不是values),不会判断value,如果value也在字典中,不会判断
    • 其他操作

      • 使用len()获取字典长度
    • 字典是可变类型

    • 字典的key:必须是可以散列的。散列是一个函数,其接受任意类型,返回一个整数。字典使用这个整数应该是来计算地址用的

      • 散列函数(hash function ):散列表中用来计算一个key对应的value位置的函数
    • 字典和list是可变类型,故不能用作 字典的key

      • 整数、浮点、字符串 都是不可变类型;高级数据类型,只有tuple 是不可变类型,故可以作为字典的key
    • 全局变量:在函数之外定义的变量。全局变量可以在任何函数中访问

      # 构建字典的三种方式
      >> a=dict()
      >>> a
      {}
      >>> a[1]=2
      >>> a
      {1: 2}
      >>> b={'1':2,'2':3}
      >>> b
      {'1': 2, '2': 3}
      >>> c={}
      >>> c[1]=2
      >>> a
      {1: 2}
      >>> b
      {'1': 2, '2': 3}
      >>> c
      {1: 2}
      >>>from collections import Iterable,Iterator
      >>> isinstance(a.values,Iterable)
      False
      >>> isinstance(a.values(),Iterable)
      True
      >>> isinstance(a.keys(),Iterable)
      True
      >>> isinstance(a.items(),Iterator)
      False
      
      

第十二章:tuple

  • tuple 是一个值的序列,是一个不可变的元素的序列。

    • 其中的数值可以是任何类型。并且可以按照整数下标索引。(相当于C中的一个数组)
  • tuple是不可变类型

  • 新建tuple

    • t= a,b,c tuple就是用逗号分隔的一列数值,可以使用括号括起来,也可以不使用

      • 如果新建的tuple中只有一个元素,则该元素后面要添加 逗号
    • 使用tuple 函数或者空括号,可以新建一个空的tuple

      • tuple的输入参数 是一个序列或者一个数
  • 取数

    • 使用整数下标取数据
    • 使用切片操作取一段数据
  • 遍历

    • 使用for循环遍历
  • tuple赋值:这是一个复制语句,左侧是一个变量的tuple,右侧是一个序列。右边的序列会被求值,它的元素会依次赋值给左侧元组中的变量

    • 这大概是tuple最有用的功能之一

    • 交换两个变量的数值,a,b = b,a

    • 同时上述 等号 右边可以是任意类型的序列,如 字符串、list 或者 tuple

      • x1,x2=a.split('^’) # a='ab^c’ a.split的返回数值是一个list
  • tuple可以作为函数的返回数值

    • 如果函数返回多个数值,可以将多个数值组合成tuple返回
  • 可变长参数元组

    • 函数可以输入不定个数的参数。这些参数以开头,这些以开头的参数会被处理(操作称之为gather,收集)成一个tuple
    • gather的反面是 scatter打散 使用 *号打散,下面例子中有,这是语法糖,永远不要使用这种看起来聪明,实际是笨蛋做法的语法糖
    • scatte:分散,把一个序列当作参数列表的操作
  • list和tuple

    • zip 函数接受两个或者多个序列,返回一个元祖列表,其中每一个元祖包含来自每个序列中的一个元素
    • zip 称之为拉链函数,可以将两个链牙交替连接起来
    • zip函数返回的结果为一个zip对象,该对象是一个迭代器,故可以迭代的访问一个序列中每一个元素,故zip通常使用在for循环中
    • 如果序列之间的长度不同,则结果的长度是所有序列中最短的那个
    • 好处是:组合的使用zip、for循环以及 tuple赋值,可以高效的便利两个或者多个序列
  • 字典和元组

    • 字典的items方法返回一个元组的系列,其中每一个元组是一个key-value对。其结果是一个dict_item对象,它是可迭代的,但是不是迭代器(Iterator)

    • 组合使用dict和zip可以得到一个简洁的创建字典的方法

      • ex: d=dict(zip('abc',range(3)))
  • 迭代器(iterator): 可以便利序列的对象,但是不提供列表的操作和方法

  • 序列的序列:指的是 含元组为元素的元组,含列表为元素的元组、含元组为元素的列表,含列表为元素的列表,即 含有序列元素的序列,统称为序列的序列

    • 不同类型的序列:字符串、列表、元组

    • 什么情况下优先使用tuple?

      • 函数返回值
      • 使用序列作为字典的key
      • 如果要向函数传入一个序列作为参数,使用tuple可能会减少潜在的有假名导致的不可预知的行为
    • tuple是不可变的,故其不提供 sort 和 reserve等会原位改变

      • python提供了内置的函数sorted,其可以接受任何序列作为参数,并按排好的序返回带有同样元素的新列表
      • python提供了reverse,同样接受序列作为参数,并返回一个以相反顺序遍历列表的迭代器
      # gather 和 scatter参数
      >>> t=(7,3)
      >>> divmod(t)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: divmod expected 2 arguments, got 1
      >>> divmod(*t)  # 永远不要使用这种模糊的方法,
      (2, 1)
      
      # zip高效遍历
      >>> a=[1,2];b=(3,4)
      >>> for x,y in zip(a,b):
      ...     print(x,y)
      ...
      1 3
      2 4
      >>> d=dict(zip('abc',range(3)))
      >>> d
      {'a': 0, 'b': 1, 'c': 2}
      >>> d.items()
      dict_items([('a', 0), ('b', 1), ('c', 2)])
      >>> isinstance(d.items(),Iterator)
      False
      
      >>> f=open("test.txt",'w')
      >>> f.write("I am a person!\n")
      15
      >>> f.close()
      >>> with open("001.txt",'r') as f:   # with 结构
      ...     for line in f.read():
      ...        print(line)
      
      >>> f=open("001.txt",'r')
      >>> ele=f.readlines()
      >>> ele
      ['1 2 a\n', 'b b c\n’]
      >>> f=open('001.txt','w')
      >>> f.writelines(x)
      >>> f.close()
      

第十四章:文件

14.2 读和写

  • 打开文件 open,关闭文件close

  • 往文件中写数据,使用write

  • 由于 open,与close必须成对出现,害怕忘记可以使用with 结构

  • python 提供了三个读取文件内容的函数: read()、readline()、readlines(); 区别如下:

    • read()
      • 每次读取整个文件的内容、其会将这个文件放在一个字符串中。当文件内容比较大的时候,可能会出问题。此时使用read(size)
    • readlines()

      • 和read一样,也是一次读取所有的数据。区别是 其自动将 文件内容划按行分成一个list
    • readline()

      • 一次读取一行,当文件内容非常大的时候,可以使用
    • 将数据写入文件,python提供了两个方法,write和writelines

      • write和read、readline函数对应,将字符串写入文件
      • writelines 和readlines()对应。输入为字符串列表。输出到文件。注意:需要显示加入换行符
      • open的mode参数,'r','w','a', a表示 追加

14.3 格式化字符串,两种方式

  • str

  • 格式化操作符 % ex: ‘%d’ % 3

    • 如果字符串中有多于一个格式序列,第二个操作对象就必须是远足,每一个格式序列按照顺序 对应元组中的每一个变量

      >>> str(3)
      '3'
      >>> "%d" % 3
      '3'
      >>> "%s,%f" % ('3',4.5)
      '3,4.500000'
      

14.4 os模块

  • 获取当前目录:os.getcwd()
  • 列举出当前目录下的文件或者目录:os.listdir()
  • 寻找文件的绝对路径:os.path.abspath('001.txt')
  • 判断文件是否存在:os.path.exists(文件名)
  • 如果一个文件存在,判断一个文件是否为目录 os.path.isdir('001.txt')
  • 如果一个文件存在,判断其是否为文件:os.path.isfile('001.txt')
  • os.path.join 接受一个目录和一个文件名称,并将其拼接为一个完整的路径

14.5 读写异常

问题:如果读的文件不存在,可能会出错

try:
   fin = open(“r.txt”)
except:
   print(“some things is wrong")

14.7 pickle

  • pickle 可以 几乎所有的对象 转化为 适合保存到数据库中的字符串,并且可以将其转 为 对象本身

  • pickle.dumps(t) 编码成特殊格式

  • pickle.loads 解码恢复

    >>> import pickle
    >>> t=[1,2,3]
    >>> pickle.dumps(t)
    b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
    >>> s=pickle.dumps(t)
    >>> pickle.loads(s)
    [1, 2, 3]
    

14.9 模块相关

  • 如果你 试图 导入一个 已经被 导入的模块,那么python 什么都不会做,即使相关模块已经修改文件
  • 解决:重新运行程序 或者 使用reload

14.10 其他

  • 问题:调试时候用来空白字符相关的东西,因为 空格、制表符号、换行符 通常都是不可见的,所以不方便调试。
  • 解决:可以使用repr 来展示变量内部的所有字符;repr 接受任何对象,返回字符串的表达形式

标签:函数,tuple,python,列表,序列,读书,思考,字符串,字典
From: https://www.cnblogs.com/douniwanli/p/18180867

相关文章

  • 异常检测(Anomaly Detection)方法与Python实现
    异常检测(Anomalydetection)是机器学习中一种常见应用,其目标是识别数据集中的异常或不寻常模式。尽管通常被归类为非监督学习问题,异常检测却具有与监督学习相似的特征。在异常检测中,我们通常处理的是未标记的数据,即没有明确的标签指示哪些样本是异常的。相反,算法需要根据数据本身......
  • python在Scikit-learn中用决策树和随机森林预测NBA获胜者
    原文链接:http://tecdat.cn/?p=5222原文出处:拓端数据部落公众号 在本文中,我们将以Scikit-learn的决策树和随机森林预测NBA获胜者。美国国家篮球协会(NBA)是北美主要的男子职业篮球联赛,被广泛认为是首屈一指的男子职业篮球联赛在世界上。它有30个队(美国29个,加拿大1个)。在常规赛......
  • 流畅的python学习笔记
    示例1-1一摞有序的纸牌知识点:collections.namedtuple构建了一个简单的类,表示单张纸牌。fromcollectionsimportnamedtupleCard=namedtuple('Card',['rank','suit'])classFrenchDeck:ranks=[str(n)forninrange(2,11)]+list('JQKA')......
  • python 构建jenkins job
    学习文档:https://www.cnblogs.com/hujinzhong/p/14593293.htmlhttps://blog.csdn.net/qq_45939519/article/details/121052408官方文档:API参考—PythonJenkins1.8.0文档(python-jenkins.readthedocs.io) 使用Python-Jenkins—PythonJenkins1.8.0文档 impor......
  • Python 将PDF转为PDF/A、PDF/X,以及PDF/A转回PDF
    PDF/A和PDF/X是两种有特定用途的PDF格式,具体查看以下:PDF/A是一种用于长期存档的PDF格式,它旨在确保文档的内容和格式在未来的访问中保持不变。如果您需要对文件进行长期存档,比如法律文件或档案记录,将其转换为PDF/A格式是一个明智的选择。PDF/X是一种用于印刷输出的PDF格式,它旨在......
  • Python中级之数据类型的内置方法1(数字类型和字符串)
    【一】数字类型【1】整数类型(int)(1)定义直接用整数定义,整数类型的值不能修改num=6(2)内置方法int.bit_length()#返回整数的二进制表示中最高位的位数,不包括符号和前导零。a=10b=a.bit_length()print(b)#输出4int.to_bytes(length,byteorder,signed)#......
  • Python安装教程手册(pip路径修改,建立模块搜索)
    下载官网64位exe安装包双击安装,一步步往下走    打开cmd命令行,输入Python-V查看安装版本号,检查是否安装成功  输入pip-V查看pip的版本号,检查是否安装成功  设置pip安装的全局库目录输入python-msite,查看当前默认配置的库目录找......
  • Python中级之数据类型的内置方法3(元祖、布尔、集合)
    【一】元祖类型(tuple)【1】定义元祖类型是有序且不可变的数据类型,通常使用小括号定义(也可以使用逗号)#用逗号定义num_tuple=1,2,3,4,5#用小括号定义num_tuple=(1,2,3,4,5)【2】内置方法(1)类型强转#使用tuple()函数将其他数据类型转换为元组类型num_list=......
  • Python中级之数据类型的内置方法2(字典和列表)
    【一】字符串类型的内置方法(熟悉)【1】查找(1)find方法#【1】默认从左到右开始查找,找得到则返回元素所在的索引位置name='ligo'str=name.find('i')print(str)#输出1#【2】也可在区间内寻找,找不到则返回-1str=name.find('g',3,4)print(str)#输出-1#【3】也......
  • Python中级之GC机制+字符编码+文件操作
    【一】深浅拷贝【1】深浅拷贝问题如果是浅拷贝,只会复制一层,如果拷贝的对象中有可变数据类型,修改可变数据类型还会影响拷贝的对象如果是深拷贝,完整复制,无论可变或不可变,都是创建出新的来,无法怎么修改原对象,都不会对拷贝出的对象造成影响(1)浅拷贝对于原对象中的可变数据类型......