python学习第一阶段核心笔记

 

一、快速入门

输出: print

输入: raw_input

列表元素: [] 类似于数组

列表的切片操作:[from:to]截取from到to的列表元素(含from,不含to)

字典元素: { } 键值对

代码缩进:四个空格,尽量不用Tab键(不同的OS,长度定义不同)

打开文件: handle = open(file_name, access_mode = ‘r')

对应 handle.close()

函数定义:def function_name([arguments]):

“optional documentation string”

function_suite

类中的 __init__()方法:当一个类被创建时, __init__()方法会自动被执行,类似构造器,它 仅仅是类对象创建后执 行的第一个方法。目的是完成对象的初始化工作。

self参数:每个方法都有这个参数。它是类实例自身的引用。相当于其它面向对象编程语言中的this。

第二节、Python 基础

特殊规则及特殊字符:

#号(#) : 注释

换行(\n):换行

反斜线( \) : 继续上一行

分号( ;) : 两个语句连在一行

冒号(:) : 将代码块的头和体分开

不同的缩进深度代表不同的代码块

Python 文件以模块的形式组织

多元赋值: x,y,z = 1,2,3 一一对应赋值(建议用小括号扩起来)

变量名必须由字母跟下划线组成,且区分大小写。对于一般的变量名建议不要用下划线开 头。

__name__ 系统变量:

>模块被导入:—name—的值为模块的名字

>模块被直接执行:—name—的值为'—main__'

内存管理:

>变量无须事先申明

>变量无须指定类型

>程序员不用担心内存管理

>变量名会被“回收”

> del语句能够直接释放资

第三节、Python 对象

Python 对象的三个特性:身份,类型,值

内建函数type():获取对象的类型

None:Python 的 NULL 对象

切片对象:sequence[起始索引:结束索引:步进值] 标准类型内建函数:

  • cmp(obj1, obj2)比较 obj1 和 obj2,返回整形 i (>0;=0;<0)
  • repr(obj)或'obj'返回obj的字符串表示
  • str(obj) 返回obj适合可读性好的字符串表示
  • type(obj) 返回obj的类型

str(),repr(),'' 三者的比较:

  • str():生成一个对象的可读性比较好的字符串表示,对用户友好
  • repr():对Python比较友好
  • '':效果跟repr()一样,建议不再使用

type()和 isinstance():

  • type(obj):返回obj的类型
  • isinstance(obj,obj_type):判断 obj 是否为 obj_type 类型,返回布尔值

可变类型:列表、字典

不可变类型:数字、字符串、元组

不支持的类型:

char 或 byte:无

指针:无

int VS short VS long : 无区别

float VS double :无区别

第四节、数字

长整型:用大写的“L”标示(虽然也可以用小写的“I”,但不建议使用)

复数:

  • 虚数不能单独存在,必须加上0.0的实数部分
  • 由实数+虚数两部分构成
  • 实数跟虚数部分都是浮点型
  • 虚数部分后缀是j或J

复数属性:

num.real 

该复数的实数部分

num.imag 该复数的虚数部分
num.conjuga te() 返回该复数的共轭复数

 

 

 

 

混合模式优先级(转化) : complex > float > long > int

幂运算(**) :比左侧操作数的一元运算符优先级低,比右侧操作数的一元运算符优先级高。

  • eg: -3 ** 2 = -9 4.0 ** -1.0 = 0.25

位操作符:只适用于整型

取反(~),安位与(&),或(|),异或("),左移(〈〈),右移(〉〉)

负数当做正数的 2 进制补码处理

num <<( 或 >> )N = num * ( 或 / )2 ** N

int(obj, base) :

返回 obj 数字的 base 进制数

  • pow()** :虽然能完成相同的作用
  • pow():内建函数
  • ** :操作符

数值运算内建函数:

abs(num)

num 的绝对值

coerce (numl, num2)

转化为同一类型,返回一个元组

divmod(numl, num2)

返回元组(numl/num2, numl%num2)

pow (numl, num2, mod=1)

取numl的num2次方,若有mod,则对其再取余

round (flt, ndig=1)

对浮点型fit进行四舍五入,保留ndig位小数

仅适用于整型的内建函数:

hex(num)

将num转化为十六进制,并以字符串返回

otc(num)

将num转化为八进制,并以字符串返回

chr(num)

返回 num 的 ASCII 值,范围: 0 <= num <= 255

“True”和“False”严格区分大小写!且分别对应“1”和“0”。

 

第五节、序列:字符串、列表和元组

字符串类型同样也是不可变的,当你要改变一个字符串的时候就必须通过创建一个新的同 名的字符串来取代它。

三引号( '''或者”””) :

允许一个字符串跨多行,字符串中可以包含换行符,制表符及其他特殊字符。

ASCII 码:每个英文字符都是以 7 位二进制数的方式存放在计算机内,范围是 32~126。

Unicode 通过使用一个或多个字节来表示一个字符的方法突破了 ASCII 的限制,可以表示超 过 90000 个字符。

ASCII 字符串-StringType 类型

Unicode 字符串-UnicodeType 类型

默认所有字面上的字符串都是ASCII编码,'u'前缀声明Unicode编码。

codec 是 Coder/DECoder 的首写字母组合。

Unicode 应用的规则:

>程序中出现字符串时前面一定要加个'『

>不要用str()函数,用unicode(H弋替

>不要用过时的string模块

>不到必须时不要在你的程序里编解码Unicode字符。只在你写入文件或者数据库或 者网络时,才调用encode()编码,相应地,只在你需要把数据读回来的时候才调 用decode()函数解码

  • Python标准库中绝大部分模块都是兼容Unicode的,除了 pickle模块只支持

ASCII。

  • Python字符串不是通过NUL或者'\0'来结束的,它除了你定义的东西,没有别的。 并非调用一个方法就会返回一个值。

那些可以改变对象值的可变对象的方法是没有返回值的。如:sort(),extend()等。

列表跟元组是两个非常相似的序列类型,之所以要保留二者是因为在某些情况下,其中一 种类型要优于使用另一种类型。

list()跟tuple()函数可以用一个列表来创建一个元组,反之亦然。

第六节 映射和集合类型

字典是 Python 中唯一的映射类型。

字典:

dict1 = ,‘name':'earth','port':80-

for key in dict1.keys():

print ‘key=%s, value=%s'% (key,dict1*key+)

映射类型内建函数:
dict.clear() 删除字典中的所有元素
dict.get(key, default=None)
返回字典中key的值,若无此键则返default
dict.fromkeys(seq, val=None)
返回一个新字典,seq为键,val为值
dict.has_key(key)
是否存在key键,返回布尔值
dict.items()
返回一个包括字典中键值对元组的列表
dict.keys()
返回一个字典中的键的列表
dict.values()
返回一个包含字典中所有值的列表
dict.update(dict2)
将字典dict2的键值对添加到字典dict中去

 

 

 

 

 

 

 

 

 键必须是可哈希的对象。像列表和字典这样的可变类型,由于它们不是可哈希的,所以不

能作为键

集合类型:

>现已成为Python的基本数据类型

>两种类型:可变集合(set)和不可变集合(frozenset)

>可用set()和frozenset()来分别创建可变集合跟不可变集合

适用于所以集合类型的内建方法:

  • s.issubset(t) 判断s是否是t的子集,返回布尔值
  • s.issuperset(t)判断s是否是t的超集,返回布尔值
  • s.union(t) 返回新集合,s跟t的并集
  • s.intersetion(t)返回新集合,s跟t的交集
  • s.difference(t)返回新集合,其成员是s的成员,但不是t的成员

第七节 条件和循环

if 循环:

if expression1:

expr1_true_suite

elif expression2:

expr2_true_suite

elif expression3:

expr3_true_suite

else:

None_of_the_above_suite

Python 不支持 switch/case 语句,但完全可以用 if/eIse 的结构来弋替

三元操作符:X if C else Y (如果条件C成立,则结果为X,否则为Y)

whiIe 语句:

while expression:

suite_to_repeat

for 语句:

for iter_var in interable:

suite_to_repeat

pass 语句: Python 中提供 pass 语句,表示不做任何事, NOP(No Operation)

def foo_func(): #空函数

pass

迭代器和iter()函数:

>迭代器就是有一个next()方法的对象

>对一个对象调用iter()方法就可以得到它的迭代器

列表解析:

列表解析(list comps)来自函数式编程语言Haskell。它是一个非常有用、简单而 且灵活的工具,可以用来动态地创建列表。

Python早就支持函数式编程特性,例如lambdamap()filter()

lambda允许用户快速地创建只有一行的函数对象.例如:map(lambda x:x ** 2, range(6))

第八节 文件和输入输出

文件内建函数(open()和file()):

  • open()语法:file_object = open(file_name, access_mode='r',buffering=-1)
  • open()和file()函数具有完全相同的功能,一般来说,建议使用open()来读文件,在

你想说明你是处理文件对象的时候使用file(),例如if isinstance(f, file)

文件内建方法:

  • 输入:read(), readlines(),for eachLine in file
  • 输出:write(),writelines()[注:没有 writeline()方法]

>文件内移动:seek() 0,1,2分别代表文件开头,当前位置,文件末尾

杂项操作:

保留行分隔符:

使用read()或者readlines()从文件中读取行时,Python并不会删除行结束符,类似 的,write()或writelines()也不会自动的加入行结束符,这得由程序员自己完成。

行分隔符和其他文件系统的差异:

不同的操作系统对行结束符的规定是不同的,但Python的os模块已经替程序员解 决了这个问题,只要导入了 os模块,其属性会自动校准文件系统,设置为正确值。

命令行参数:

  • sys.argv是命令行参数的列表
  • len(sys.argv)是命令行参数的个数(也就是argc)

 

第九节 错误和异常

Python 中常见的异常:

  • NameError :尝试访问一个未申明的变量
  • ZeroDivissionError:除数为零
  • SyntaxError : Python解释器语法错误
  • IndexError :请求的索引超出序列范围
  • KeyError :请求一个不存在的字典关键字
  • IOError :输入\输出错误
  • AttributeError : 尝试访问未知的对象属性
  • Keyboard In terrupt : 中断异常
  • BaseException :所有异常的基类

检测和处理异常: try-except 和 try-finally

处理多个异常的时候可以用多个except,也可以用一个except,然后将异常放入一个元组 里

不推荐使用空 except 语句

else子句:try-except-else:在try范围内没有异常被检测到时,执行else子句

finally子句:try-except(-else)-finally:无论异常是否发生,是否捕捉,都会执行的一段代 码。

raise 语句:触发异常。一般语法:

raise [SomeException [,args [,traceback]]]

第一个参数:SomeException:触发异常的名字

第二个参数:args:可选,作为一个对象或者对象的元组传给异常

第三个参数:traceback:可选,很少用

断言:断言是一句必须等价于布尔真的判定,否则将产生AssertionError (断言错误)的异 常,同时也说明是假。

语法: assert expression[, arguments]

建议跟try-except连用,将断言语句放在try中

sys模块中的exc_info()函数,通过其提供的一个3元组信息同样可以捕捉异常信息:

sys.exc_i nf o()得到的元组:

exc_type:异常类

exc_value:异常类的实例

exc_traceback:跟踪记录对象

不过,在未来的 python 中,这三个对象将被逐步停用,并最终移除。

第十节 函数和函数式编程

创建函数:

def function_name(arguments):

“function_documentation_string”

function_body_suite

前向引用:Python也不允许在函数未声明之前,对其进行引用或调用。

Python 支持在外部函数的定义体内创建内嵌函数

函数中使用默认参数会使程序的健壮性上升到极高的级别。

Python 不是也不大可能会成为一种函数式编程语言,但是它支持许多有价值的函数式编程 语言构建。

函数式编程的内建函数:

Filter(func, seq):

调用一个布尔函数 func 来迭代遍历每个 seq 中的元素;返回一个使 func 返 回值为 true 的元素的序列

Map(f unc, seq1[,sql2...]):

将函数 func 作用于给定的序列 seq 中的每个元素,并用一个列表来提供返 回值

Reduce(func, seq):

将一个二元函数作用于 seq 序列的元素,每次携带一对(先前的结果以及 下一个序列元素),连续地将现有的结果和下一个值作用,最后减少我们的序列为 一个单一的返回值

变量作用域:

全局变量除非被删除,否则它们存活到脚本运行结束,且对所有的函数都是可访问

的。

为了明确地引用一个已命名的全局变量,必须使用global语句。

第十一节 模块

模块支持从逻辑上组织Python代码。

与其他可以导入类(class)的语言不同,Python带入的是模块或模块属性。

语法: import module1[,module2[,...]]

from module import n amel*, name2[,...]]

from module import name as shortname

from module import *

import 语句的模块顺序:

  • Python标准库模块
  • Python第三方模块

>应用程序自定义模块

导入( import )和加载( load ) : 一个模块之恩那个被加载一次,无论它被导入多少次。

模块内建函数:

__import__()函数: __import__(module_name[,globals[,locals[,fromlist]]])

globals()和locals()分别返回调用者全局和局部名称空间的字典。

reload()重新导入一个已经导入的模块: reload(module)使用reload()时候必须是全部

导入,而不是使用 from-import。

禁止模块的某个属性导入,可以在该属性名称前加一个下划线: import foo._bar

第十二节 面向对象编程

在 Python 中,面向对象编程主要有两个主题,就是类和类实例。

利用 class 关键字创建一个类:

class MyNewObjectType(bases): #bases 参数用于继承的父类

‘define MyNewObjectType class'

Class_suite object 是“所有类之母”,若未指明父类,则 object 将作为默认的父类。

创建一个实例的语法:(注意:没有使用 new, Python 根本就没有 new 这个关键字)

myFirstObject = MyNewObjectType()

添加类方法:

class MyDataWithMethod(object): #定义类

def printFoo(self): #定义方法

print ‘You invoked printFoo()'

你可能注意到 self 参数,它在所有的方法声明中都存在。并且必须是第一个参数。这个参 数代表实例对象本身,当你调用方法的时候由解释器悄悄地传递给方法,而不需要你自己 传递 self。

__init__()方法:类似于一个构造器,但不能说是一个构造器(因为 Python 没有使用 new),它在创建一个新的对象时被调用,完成一个初始化工作。

类、属性和方法的命名方式: 类:通常大写字母打头。这是标准惯例。有助于识别类。 属性:小写字母打头 + 驼峰,使用名词作为名字。 方法:小写字母打头 + 驼峰,使用谓词作为名字。

在 Python 中,声明与定义类是没有什么区别的,因为它们是同时进行的,定义(类体) 紧跟在声明(含class关键字的头行)和可选(但总是推荐)的文档字符串后面。

Python不支持纯虚函数(如C++)或抽象方法(如Java)。

Python 严格要求,没有实例,方法是不能被调用的。方法必须绑定(到一个实例)才能被 直接调用。

dir(class_name): 返回类对象的属性的一个名字列表

class_name.__diet__ : 返回的是一个字典,key是属性名,value是数据值

__init__()方法不应该返回任何对象,即,它应该返回None,否则将产生TypeError。

实例属性VS类属性: 类属性跟实例无关。这些值像静态成员那样被引用,即使在多次实例化中调用类, 类属性的值都不会改变。

子类可以通过继承覆盖父类的方法。类似,如果在子类中覆盖了了__init__()方法,那么基 类的__init__()就不会被自动调用了。

同C++一样,Python支持多继承。但要处理好两个方面:

>要找到合适的属性

>重写方法时,如何调用对应父类以“发挥他们的作用”,同时,在子类中处理好自 己的义务

vars()内建函数与dir()相似,知识给定的对象都必须有一个__diet__属性。vars()返回一个字 典,包含了对象存储于其__dict__中的属性(键)和值。

第十三节 执行环境

Python 有三种不同类型的函数对象。分别是:

>内建函数(BIF): C/C++写的,编译过后放到Python解释器当中的。

>用户定义的函数(UDF)

> lambda表达式

compile():

>它允许程序员在运行时迅速生成代码对象,然后就可以用exec语句或者内建函数 eval()来执行这些代码或者对它们进行求值。

  • compile(stri ng, file, type)这三个参数都是必须的。
  • 第一个参数:string:要编译的Python代码
  • 第二个参数:file:虽然是必须的,但通常被置为空串
  • 第三个参数:type:字符串,用来表明代码的类型。有三个可能值:

‘eval':可求值的表达式(和eval()连用)

‘single':单一可执行语句(和exec连用)

‘exec':可执行语句组(和exec连用)

Eg1:

>>>eval_code = compile(‘100+200', ‘', ‘eval')

>>>eval(eval_code)

300

Eg2:

>>>single_code = compile(‘print “hello”', ‘', ‘single')

>>>exec single_code

Hello

用compile()预编译重复代码有助于改善性能,因为在调用时不必经过字节编译处理。

exee obj :

接受对象(obj)可以是原始的字符串,也可以是有效的Python文件。

一旦执行完毕,继续对exec的调用就会失败,因为obj已经到了 EOF 了,若想继 续调用exec,则必须对obj调用seek (0)到文件开头。

tell()方法:告知当前在文件的何处

os.path.getsize():告知对象文件有多大

结束执行:

  • sys. exit() and SystemExit
  • sys. exitfune()
  • os・_exit(status):跟以上两种不同,它不执行任何清理就直接退出Python解释器。

且 status 参数是必须的。

posted @ 2023-08-17 18:34  L&ZH  阅读(25)  评论(0)    收藏  举报