目录
前述
编程语言由什么构成?
- 编程语言是用来操作数据完成特定任务的。
- 最基本的元素就是数据。数据以数、字符为基本单位。有一阶单位构成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表示 追加
- read()
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 接受任何对象,返回字符串的表达形式