1、eval( )函数用来执行一个字符串表达式,并返回表达式的值。
2、Hanoi塔的解法是递归方法的典型应用。
3、Python 语言是面向对象的。
4、Python 可以不加声明就使用变量。
5、Python的数据类型分为:整型、字符串类型、浮点型、复数等类型。Python序列类型包括元组、列表、字典三种。
不可变的列表称为元组,元组使用圆括号表示。元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不可变,可使用元组。
6、Python不支持char类型的数据类型。Python可变数据类型:列表和字典。不可变数据类型:字符串、数字、元组。
列表(由方括号[]表示,使用逗号来分割其中的元素)是由一系列按特定顺序排列的元素组成。列表可以包含字符、数字、字符串,任何东西都可以加入列表,其中的元素可以没有任何关系。
Python中列表支持负索引和切片。
列表末尾添加元素:listname.append(元素)
列表中插入元素:需指定索引和元素值 listname.insert(索引,元素值)
列表删除元素:del listname[索引]
列表删除末尾元素:listname.pop( )
列表永久性排序:listname.sort( )
列表临时排序:listname.sorted( ) //能够按特别顺序显示列表的元素,同时不影响他们在列表中的原始排列顺序。
反转列表元素的排列顺序:listname.reverse( )
循环列表:for 元素 in list:
for value in range(1,5) //数字1,2,3,4
使用range创建列表: numbers = list(range(1, 9))
列表统计计算:min( )、max( )、sum()
列表解析:将for循环和创建新元素的代码合并成一行,并自动附加新元素。
squares = [value**2 for value in range(1, 11)]
检查特定值是否包含在列表中,使用关键字in / not in
与、或、非:and、or、!=
条件语句: if、if-else、if-elif-else、if-elif-elif-elif-else、if-elif-elif-elif
Python中的合法标识符:
A.python中的标识符是区分大小写的。
B.标示符以字母或下划线开头,可包括字母,下划线和数字。
C.以下划线开头的标识符是有特殊意义的。
> 以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;
> 以双下划线开头的(__foo)代表类的私有成员;
> 以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如__init__()代表类的构造函数。
a.不能以数字开头
b.不能包含非法字符
c.数字不能作为标识符
d.不能包含空格
e.不能包含运算符
f.python保留关键字不能作为标识符
7、变量的命名和使用:
a:变量名只能包含字母、数字、下划线
b:变量名不能包含空格,可使用下划线来分割单词
c:不要讲Python关键字和函数名作为变量名
d:变量名要简短又具有描述性
e:慎用小写字母l和大写字母O,因为易被错看成数字1和0。
8、注释:在每个程序中都至少添加一条注释,可在程序文件开头加上你的姓名和当前日期,用一句话描述程序的功能。
9、类的编码风格:
a:类名采用驼峰命名法,每个单词首字母都大写,而不使用下划线,实例名和模块名都采用小写格式,并在但此件之间加下划线。
b:每个类,在类定义后面包含一个文档字符串,简述类功能
c:在类中,使用一个空行来分割方法;在模块中,可使用两个空行来分隔类
d:同时导入标准库和自己编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入自己编写的import语句。
Python改进提案PEP:Python Enhancement Proposal, PEP8是最古老的PEP之一。
TODO注释应该在所有开头处包含”TODO”字符串,紧跟着是用括号括起来的你的名字, email地址或其它标识符,然后是一个可选的冒号,接着必须有一行注释,解释要做什么。
# TODO(kl@gmail.com): Drop the use of "has_key".
# TODO(Zeke) change this to use relations.
20、try:
可能引发异常的代码
except 异常类型名称:
引发异常时,需要运行的代码
else:
try代码块运行正常时运行的代码
finally:
无论是否发生异常都要运行的代码
21、匿名函数:
lambda argument1, argument2,... argumentN : expression
square = lambda x: x**2
print(square(2))
22、什么是装饰器?
python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。
这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数。
import time
def deco(f):
def wrapper():
start_time = time.time()
f()
end_time = time.time()
execution_time = (end_time - start_time)*1000
print("time is %d ms" %execution_time )
return wrapper
@deco
def f():
print("hello")
time.sleep(1)
print("world")
if __name__ == '__main__':
f()
这里的deco函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数。其中作为参数的这个函数f()就在返回函数wrapper()的内部执行。然后在函数f()前面加上@deco,
f()函数就相当于被注入了计时功能,现在只要调用f(),它就已经变身为“新的功能更多”的函数了,(不需要重复执行原函数)。
23、使用 isinstance() 代替对象类型的比较。 if isinstance(obj, int):
24、 拼写错误 、 错误表达式、缩进错误 都会导致程序的终止。
25、什么是生成器函数?
它是一个在执行时能中途暂时退出,后面重新调用又能重新进入继续执行的一种函数。并且在函数内定义的变量的所有状态不受中途退出的影响。
如果你还没有对yield有个初步分认识,那么你先把yield看做“return”。
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
>>>
starting...
4
********************
res: None
4
带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。
26、永远不要用==将一个布尔量与false 相比较. 使用 if not x: 代替.
如果你需要区分false 和None, 你应该用像 if not x and x is not None: 这样的语句。
27、定义函数的规则?
1函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4函数内容以冒号起始,并且缩进。
5 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
28、__new__和__init__的区别?
__new__是一个静态方法,而__init__是一个实例方法.
__new__方法会返回一个创建的实例,而__init__什么都不返回.
只有在__new__返回一个cls的实例时后面的__init__才能被调用.
当创建一个新实例时调用__new__,初始化一个实例时用__init__.
29、read,readline和readlines之间的区别?
read 读取整个文件
readline 读取下一行,使用生成器方法
readlines 读取整个文件到一个迭代器以供我们遍历
30、去掉old_list = [1,1,1,3,4 ] 中的重复元素
new_list = list(set(old_list))
31、用两个元素之间有对应关系的list构造一个dict
names = ['jianpx', 'yue']
ages = [23, 40]
m = dict(zip(names,ages))
32、如果一个类不继承自其它类, 就显式的从object 继承. 嵌套类也一样。
继承自 object是为了使属性(properties)正常工作,并且这样可以保护你的代码,使其不受Python 3 的一个特殊的潜在不兼容性影响,这样做也定义了一些特殊的方法,这些方法实现了对象的默认语义,包括 __new__、__init__、__delattr__、__getattribute__、__setattr__、__hash__、__repr__and __str__。
33、文档字符串
Python 有一种独一无二的的注释方式:使用文档字符串。文档字符串是包、模块、类或函数里的第一个语句,这些字符串可以通过对象的__doc__成员被自动提取,并且被pydoc 所用。(你可以在你的模块上运行pydoc 试一把,看看它长什么样)。我们对文档字符串的惯例是使用三重双引号。 一个文档字符串应该这样组织:首先是一行以句号、问号或惊叹号结尾的概述,接着是一个空行,接着是文档字符串剩下的部分,它应该与文档字符串的第一行的第一个引号对齐。下面有更多文档字符串的格式化规范:
模块每个文件应该包含下列项,依次是:
1. 版权声明(例如, Copyright 2008 Google Inc.)
2. 一个许可样板,根据项目使用的许可(例如:Apache 2.0、BSD、LGPL、GPL),选择合适的样板
3. 作者声明,标识文件的原作者。
函数和方法
如果不是既显然又简短,任何函数或方法都需要一个文档字符串,而且,任何外部可访问的函数或方法,不管多短多简单,都需要文档字符串。文档字符串应该包含函数做什么,以及输入和输出的详细描述,通常,不应该描述“怎么做”,除非是一些复杂的算法。对于技巧性的代码,块注释或者行内注释是最重要的。文档字符串应该提供足够的信息,当别人编写代码调用该函数时,他不需要看一行代码,只要看文档字符串就可以了。应该给参数单独写文档。在冒号后跟上解释,而且应该用统一的悬挂式2 或4空格缩进。文档字符串应该在需要特定类型的地方指定期望的类型。“Raise:”部分应该列出该函数可能触发的所有异常。生成器函数的文档字符串应该用“Yields:”,而非“Returns:”;类应该在其定义下有一个用于描述该类的文档字符串。如果你的类有公共属性(Attributes),那么文档中应该有一个属性(Attributes)段,并且应该遵守和函数参数相同的格式。
34、正则表达式:
re.match(pattern, string, flags =0): 从字符串的起始位置进行匹配,匹配成功返回匹配对象,否则返回None。
re.search(pattern, string, flags =0): 在字符串的任意位置,搜索第一次出现的匹配情况进行匹配,否则返回None。
findall(pattern, string [ , flags]) :查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表。
finditer(pattern, string [ , flags]):功能与findall相同,但返回是一个迭代器。对于每次匹配,迭代器都返回一个匹配对象。
split(pattern, string,max)根据正则表达式的模式分隔符,split函数将字符串分割为列表,然后返回成功匹配的列表,分割最多操作max次(默认分割所有匹配成功的位置)
常用的匹配对象方法:
group( num= 0) :要么返回整个匹配对象,要么根据要求返回一个编号为num的特定子组。
groups()方法则仅返回一个包含唯一或者全部子组的元组。
groupdict()返回一个包含所有匹配的命名自足的字典所有的子组名称作为字典的键(如果没有成功匹配,返回一个空字典)
sub(pattern,repl,string,count)使用repl替换所有正则表达式的模式在字符串中出现的位置,除非定义count,否则就将替换所有出现的位置。
purge()清楚隐式编译的正则表达式模式
35、Python关键字
37、Python中is和==的区别:
Python中对象包含三个基本要素:id(身份标识)、type(类型)、value(值)。
is和==都是对对象进行判断作用的,但对对象的比较判断的内容并不相同,
== 是Python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等。
is :同一性运算符,比较判断的是对象间的唯一身份标识,也就是id 是否相同。