1. __name__
class Person:
def __init__(self):
pass
def getAge(self):
print __name__
p = Person()
p.getAge()
以上代码作为脚本文件运行时(而不是作为模块被引用),将输出__main__
2. sys.argv
以这种方式运行脚本
python my.py v1 v2
from sys import argv如何获得v2的参数值?
:argv[2]
sys.argv是传递给python脚本的命令行参数【字符串】列表
argv[0]为该脚本自身路径,其余为命令行参数
3. 浅复制和深复制:
浅复制是指只拷贝父对象,不会拷贝对象的内部的子对象,内部子对象的引用是共享的。
深复制则完全独立于原对象
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
a == [1,2, 3, 4, ['a', 'b', 'c'], 5]
b == [1,2, 3, 4, ['a', 'b', 'c'], 5]
c == [1,2, 3, 4, ['a', 'b', 'c']]
d == [1,2, 3, 4, ['a', 'b']]
4. 字符串和字符概念问题:
python中不存在char,字符串也不以“\0”结尾
以”\0”结尾是C/C++中存在。
5. 逻辑运算
a = 'a'
print a > 'b' or 'c'
:c
6. 字典
dict2 = { 3 : 5 }
dict4 = {(1,2,3): “uestc”}
错误:
dict3 = {[1,2,3]: “uestc”}
字典的键必须是唯一且不可变的,而list对象是可变的,所以不能作为键值来生成字典。
7. 装饰器函数
def dec(f):
n = 3
def wrapper(*args,**kw):
return f(*args,**kw) * n
return wrapper
@dec
def foo(n):
return n * 2
foo(2)
:12
装饰器本身是一个函数,目的是在不改变待装饰函数代码的情况下,额外增加功能,装饰器的返回值是已装饰的函数对象。
所以上面的foo(2)等价于:
foo = dec(foo)
foo(2)
执行过程其实为:
foo(2) = wrapper(2) = foo(2)*3 = 2*2*3 = 12
8. 异常捕捉顺序问题
a = 1
try:
a += 1
expect:
a += 1
else:
a += 1
finally:
a += 1
print a
:4
try:的语句出现异常才会执行except后的语句,
如果正常,则执行完try后执行else。
另外,finally语句不管有无异常都会执行。
9. 内存管理
对: 变量不必事先声明
错: 变量无须先创建和赋值而直接使用
对: 变量无须指定类型
对:可以使用del释放资源
Python 是弱类型脚本语言,变量就是变量,没有特定类型,因此不需要声明。
但每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
用 del 语句可以释放已创建的变量(已占用的资源)。
10.*args 和 **kwargs
*args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)
def foo(x,y=1,*args):
print(x)
print(y)
print(args)
foo(1,2,3,4,5)#其中的x为1,y=1的值被2重置了,3,4,5都给了args
**kwargs:(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)
def foo(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
foo(1,2,3,4,y=1,a=2,b=3,c=4)#将1传给了x,将2,3,4以元组方式传给了args,y=1,a=2,b=3,c=4以字典的方式给了kwargs
1
(2, 3, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}
位置参数、args、kwargs三者的顺序必须是位置参数、args、kwargs
位置参数、默认参数、kwargs三者的顺序必须是位置参数、默认参数、**kwargs,
11. python 浮点数问题:
1.2 - 1.0
Out[160]: 0.19999999999999996
因为Python 中浮点数的运算存在误差
12.变量有效范围:
x = 1
def change(a):
x += 1
print x
change(x)
报错:因为x在未赋值前调用。
正确写法:用 global 声明变量 x,使其成为全局变量
x = 1
def change(a):
global x
x += 1
print x
change(x)
正确写法2:将函数内的 x 参数改为 a
x = 1
def change(a):
a += 1
print a
change(x)
13. 运行层面问题:
从运行层面上来看,从四个选项选出不同的一个:
JAVA
Python
objectC
C#
Python 只有它是动态语言
动态语言的定义:动态编程语言 是高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用。它是一类 在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。众所周知的 ECMAScript ( JavaScript )便是一个动态语言,除此之外如 PHP 、 Ruby 、 Python 等也都属于动态语言,而 C 、 C++ 等语言则不属于动态语言。
14.方法命名方式
Python中单下划线_foo与双下划线__foo与__foo__的成员,下列说法正确的是?
对:
_foo 不能直接用于’from module import *’
__foo解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名
__foo__代表python里特殊方法专用的标识
错:
__foo 可以直接用于’from module import *’
python中主要存在四种命名方式:
1、object :公用方法
2、_object :半保护
被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些变量, 在模块或类外不可以使用,不能用’from module import *’导入。
__object 是为了避免与子类的方法名称冲突, 对于该标识符描述的方法,父类的方法不能轻易地被子类的方法覆盖,他们的名字实际上是_classname__methodname。
3、__ object:全私有,全保护
私有成员“private”,意思是只有类对象自己能访问,连子类对象也不能访
问到这个数据,不能用’from module import *’导入。
4、__ object__ :内建方法,用户不要这样定义
15. __new__和__init__的区别
__new__是一个静态方法,而__init__是一个实例方法
__new__方法会返回一个创建的实例,而__init__什么都不返回
只有在__new__返回一个cls的实例时,后面的__init__才能被调用
当创建一个新实例时调用__new__,初始化一个实例时用__init__
16 解释型语言的特性
python是解释性语言
解释性语言和编译性语言的定义:
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。
解释性语言的定义:
解释性语言的程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。
现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。
编译性语言的定义:
编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
17.Python的映射类型
字典是 Python 语言中唯一的映射类型。
18 xrange()
[i**i for i in xrange(3)]
[1, 1, 4]
0**0=1 , 1**1=1, 2**2=4
18.协程
下列对协程的理解错误的是?
一个线程可以运行多个协程:对
协程的调度由所在程序自身控制:对
Linux中线程的调度由操作系统控制:对
Linux中协程的调度由操作系统控制:错
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
协程拥有自己的寄存器上下文和栈。
协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
19. 编解码
有一段python的编码程序如下:urllib.quote(line.decode("gbk").encode("utf-16")),请问经过该编码的字符串的解码顺序是:
url解码 utf16 gbk
题中,先将line解码为gbk编码格式,在编码为utf-16,在进行url编码
20. 元组
若 a = (1, 2, 3),下列哪些操作是合法的?
a[1:-1]
a*3
a[2] = 4 错误
list(a)
元组(tuple)不可变