赞
踩
答: *args 用来将元素打包成tuple来给函数处理, ** kwargs将参数打包成dict来给函数处理。
答: python 解释器是用来运行python程序的代码程序,可以将源代码转换为字节码
答: 源代码是指.py文件里面的代码,字节码是python解释器将.py文件转化为.pyc文件里的代码。
答: PVM是python的虚拟机, python运行时引擎编译得到的代码。
python解释器将录入的源代码转化为字节码后,字节码在pvm上运行,其中pvm仍然需要解释字节码文件,在pvm里,Python不需要反复重分析和重分解每一行语句,这就解释了python的运行速度在传统的编译语言和传统的解释语言之间。
答: CPython是python脚本化c和c++程序的实现,Jython是python脚本化java应用程序的实现,IronPython是脚本化.net的实现; python代码被这些系统翻译成对应的c、c++、java、.net语句来执行。
答: 数字、字符串、列表、元组、字典、集合、文件。
答: python中的数字、字符串、元组是不可改变的,在内存中只有一份,不能重新赋值。例如变量
a=5
a=6 # 实际上是在内存中新开辟了一个地址空间,与a=5的地址空间是不一样的。
答: 序列值一个对位置进行排序的对象组合。python中的字符串、列表、元组是序列,支持索引、合并、分片
答: python中的多态是指一个操作符拥有多种形态,比如在一个函数中使用到了符号"+", 用在两个数字之间,表示的数字的运算,用在字符串与数字、字符串之间表示为拼接。
答:
答: x if y else z, 如果满足条件y,那么取x,否则取z
答:
操作符 | 描述 |
---|---|
x and y | 逻辑与,只有x为真的时候,才计算y。 |
x or y | 逻辑或,只有x为假的时候才计算y。 |
not x | 逻辑非 |
x in y , x not in y | 成员关系(可迭代对象、集合) |
x is y, x is not y | 对象关系, 如判断x是否为None |
x<y , x>y ,x<=y ,x>=y | 大小比较,用于集合的比较。 |
x==y,x!=y | x等于y,x 不等于y |
x|y | x位或y, 集合并集 |
x & y | 位与,集合交集 |
x ^ y | 位异或 |
x<<y, x>>y | 表示x 左移y位,x右移y位 |
x+y,x-y | x减y, 集合的差减 |
x * y , x%y, x/y , x//y | 乘法或重复(x为字符串,y为数字时表示重复拼接x字符串),余数或格式化,除法,真除法或floor除法, 真除法指 // ,其中有一个数为浮点数,那么返回的结果为浮点数。 |
-x,+x | 一元减法,加法/识别 |
~x | 按位取反 |
x**y | 按幂运算 |
x[i] | 索引 |
x[i:j:k] | 分片 |
x(…) | 函数、方法、类或其他可以调用的 |
x.attr | 属性引用 |
(…) | 元组、表达书、生成器表达式 |
[…] | 列表、列表解析 |
{…} | 字典、集合、字典和集合的解析 |
答: 因为python采用双精度浮点数来存储小数,在内存中占有8个字节,一共64位,其中52位为有效数字,11位存储指数,1位存储符号位。在小数转化为二进制数的过程中,很容易生成写不尽的二进制串,如十进制数0.1 ,转换成二进制数为: 0.0001100110011001100110011001100110011001100110011001…… , 长度明显大于52位,因此会从53位开始舍去或者进1, 因此会出现经度丢失的问题。
答: oct(v) , hex(v) ,bin(v) ,其中v为整数。
答: 通过int(v) 转换,其中v为十六进制数、八进制数或二进制数,如果是"0x123",那么可以使用eval()方法进行转换,但是eval()方法运行起来或存在内存开销和安全的问题。
答:
>>>a=3
>>>a=“span”
1) a=3, python会先在内存中创建一个对象3, 同时创建一个变量a, 用来接收对象3的引用,就是说a变量对应的引用指向了对象3。
2) a=“span”, python 又会创建一个对象"span", 由于变量a已经存在,那么就直接把变量a的引用指向了对象"span", 至此,对象3就成为了在内存中没有引用的对象。
3)由于没有引用指向"3", 那么垃圾收集器就开始工作,回收掉该对象,同时释放掉该对象对应的内存。
import copy a = [1, 2, 3] c = a b = copy.copy(a) print(b, "是否相等:", b == a) a = [1, [1, 2, 3], 2, 3] b = copy.copy(a) print(b, "是否相等:", b == a) b = copy.deepcopy(a) print(b, "b是否相等a:", b == a) # True print(b, "b是否相等c:", b == c) # False print(b, "a是否相等c:", a == c) # False # 将a的引用赋值给C后,b还是和a相等,c那么就是一个新的引用,即新的地址指向[1,2,3]
由于b是a 拷贝出来的,那么地址也是一样的,相等于是同一个东西,因此是相等的。c=a, 是指python会在内存中先创建一个变量c, 地址当然与a是不一样的, 但是a与c 都是引用对象[1,2,3], 所以c与a和b不相等。
答: 深拷贝是指拷贝本对象以及本对象所有的引用都会复制一份,浅拷贝是指只复制当前对象里的所有属性内容,不包括引用。
答:
转移 | 意义 |
---|---|
\ | 反斜杠 |
’ | 单引号 |
‘’ | 双引号 |
\b | 倒退 |
\f | 换页 |
\n | 换行 |
\t | 水平制表符 |
\v | 垂直制表符 |
\xhh | 十六进制,转义的十六进制的长度始终为1 |
\000 | 八进制,转义的八进制长度始终为1 |
\0 | NULL(字符串结尾) |
1) s='a\0b\0c'
len(s)
2) s='\001\002\003'
len(s)
3) s='\x00m'
len(s)
打印结果分别为:
答:
s= 'a big apple'
s= s[:2]+"new"+s[5:]
s= 'a big apple'
s=s.replace("big",new)
s= 'a big apple'
pos=s.find("big")
s=s[:pos]+"new"+s[pos+3:]
最终打印结果都为:
操作 | 解释 |
---|---|
s="""…""" | 三引号,多行注释,同时也表示一个字符串相当于’…’ |
s=r’abc’ | raw字符串,能够抑制转义,一般用在url上 |
s1+s2 | 合并字符串s1,s2 |
s1*3 | 重复字符串3遍 |
“a %s applie”% big | 格式化字符串 |
s.rtrip() | 移除空格,压缩字符串 |
s.split(",") | 将字符串按照’,’ 分割 |
s.isdigit() | 返回值为boolean,判断该字符串是否为数字字符串 |
s.lower() | 转换为小写 |
s.endwith(“test”) | 结束测试,是否以test结尾 |
‘,’ .join(strlist) | 给字符串插入分隔符, |
s.encode(“latin-1”) | unicode编码 |
‘test’ in s | 判断是否在字符串中 |
[x for x in x] | 迭代列表,字符串转换成列表 |
m = map(lambda g: ord(g.swapcase()), s) | 通过方法ord() 进行转换, 返回一个map object,map是一个迭代器 |
答: python的内置函数ord(‘a’),可以将单个字符转换成ascii码, 内置的chr(12),可以将字符转换为对应的整数。
答: 不能,会出现异常 : TypeError: ‘<’ not supported between instances of ‘str’ and ‘int’
另外,在python 2.6之前,列表里的不同类型数据是可以比较的,并且Int类型比str类型小。
答: 因为执行append()方法添加元素时,不需要创建新的对象,而用"+"时,会创建出一个新的列表对象,然后再做拼接,创建对象或消化额外的资源和时间。
import time import random l = [1, 2, 4] start = time.time() # 使用append添加100万个元素耗时9s for i in range(0, 1000000): l.append(random.randint(0, 10)) end = time.time() print("总共耗时:", (end - start)) # 使用+ 来添加1000个元素 start = time.time() for i in range(0, 1000): l + [random.randint(0, 10)] end = time.time() print("总共耗时:", (end - start))
打印结果:
总共耗时: 0.9624276161193848
总共耗时: 3.5864064693450928
答: 代码实现如下:
# 使用列表实现一个栈
class Stack:
array = []
# 入栈
def push(self, val):
self.array.append(val)
# 弹出栈顶元素
def pop(self):
self.array.pop()
答: 首先,看一下Print()方法
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
"""
pass
可以发现,打印出来的内容其实可以输出到file里,通过赋值给sys.stdout将打印在控制台上的文字输出到文件里。
方式一 :全局输出定向到文件里, 相当于用文件去接收print()方法里的内容
import sys
sys.stdout = open("log.txt", 'a')
print("error info!")
方式二: 指定输出到文件里,此方式比第一种方式较灵活。
log = open("log.txt", 'a')
print("a", "b", file=log)
print("abc")
执行代码,查看log.txt文件:
答:
1) 多重目标赋值方式 a=b=c=1
2) 序列赋值方式a,b,c=1,2,3 或者一行赋值多个,a=1,b=2,c=3
3) 可以使用分页在一行赋值多个变量。a=1;b=2;c=3 ,这本来是三个独立的表达式
答:
比如a=b=c=[], 如果是三个变量的值引用同一个列表对象,那么其中一个a改变了[] 的 容量,b和c的打印出来的值也会发生改变,而数字和字符串是不会出现这样的问题的,因为数字和字符串是不可变的对象。
答:
L.sort()的返回值为None, 如果用None赋值给L,那么排序后的结果为None。
答: 处理模式的参数默认值为‘r’: 读取输入。
答:
def generate_number(length):
start = int("1" + "0" * (length - 1))
end = int("9" * length)
return random.randrange(start, end)
答: 会返回一个None。
答: 88, 因为局部变量非global不能修改全局变量。
答: global能在方法里声明一个全局变量,带有global的变量可以被函数外部引用。
X = 88
def func():
global X
X = 99
func()
print(X)
打印结果为: 99
答: nonlocal是指定函数外部的变量的修改可以只在一个函数起作用,作用的范围只在一个函数里,在python3.0引入。
nonlocal和global的区别在于,对外部变量的修改影响的作用范围不同,global声明的变量可以影响全局,nonlocal声明的变量对外面变量的影响只在本函数内, 另外nonlocal一般会应用在嵌套作用域里,能控制变量影响的范围。
例: 默认情况下,嵌套作用域不允许修改外部的变量, 那么可以使用nonlocal修改嵌套作用域的变量
def func1(a):
state = a
def nested(b):
nonlocal state
state += 1
print(state, b)
return nested
F = func1(5)
F(6)
打印结果: 6 6
注:
使用nonlocal在嵌套作用域里声明变量时,一定要注意变量必须在嵌套作用域的外部声明,否则会抛出异常:
no binding for nonlocal state。
而global声明的变量,不需要在外部存在!
答: LEGB原则是变量名解析的一个原则。主要包含以下三点:
答:
1) 对于输入使用参数并且对于输出使用return语句。
2) 只要在真正必要的情况下使用全局变量。
3) 不要改变可变类型的参数。
4) 避免直接改变在另一个模块文件中的变量。
1) 每一个函数应该都有单一、统一的目标。
1) 每一个函数应该相对较小。
答: x if y else z 等同于((y and x) or z)
答: map函数用来收集每一项函数传过来的结果,filter收集每一项返回结果为True的值,reduce不能在内置作用域使用,只能通过functools来导入reduce,用来计算所有项的和或乘积等,返回结果为一个值。map和filter的结果需要通过list()方法来转换得到一个列表结果。
答: 函数注解在python 3.0后可以使用,主要是对函数的参数和返回结果进行说明, 可在终端使用__annotations__属性获取到所有的属性,返回的结果是一个字典。
>>> def func(a:'apple',b:'banana'):
... return a+b
...
>>> func(1,2)
3
>>> func.__annotations__
{'a': 'apple', 'b': 'banana'}
>>>
答: if __name__=="__main__"
答: 如果只是改变 sys.pyth 列表里的内容,在程序退出时,sys.pyth列表的内容会恢复成之前的模样,即程序对其修改无效,如果修改pythonpath,那么搜索路径对所有程序都有效。
答: 通过import语句,并通过exec来进行执行,或把字符串名传给__import__函数来进行调用。
答: 是在从类生成实例时,会自动调用__init__()方法,我们可以在该方法里初始化类的属性。
答: 使用try… except 异常类型 as e, 来拦截并处理异常,在项目中要避免空except的情况,否则可能会导致应用程序终止。
map的__init__方法为:
def __init__(self, func, *iterables): # real signature unknown; restored from __doc__
pass
实现:
a = [1, 2, 3, 5]
res = list(map(lambda x: x * 2, a))
print(res)
a = [ { "value": "用途", "name": "t4" }, { "value": "期初累计摊额", "name": "t10" }, { "value": "原值", "name": "t5" }, { "value": "增加日期", "name": "t3" }, ] a.sort(key=lambda s: int(s["name"][1:])) # a.sort(key=lambda s: s["name"]) print(a)
打印结果:
[{'value': '增加日期', 'name': 't3'}, {'value': '用途', 'name': 't4'}, {'value': '原值', 'name': 't5'}, {'value': '期初累计摊额', 'name': 't10'}]
import datetime
now = datetime.datetime.now()
符号 | 含义 |
---|---|
** | 乘方,如10**2=100 |
pow(x,y) | x的y次方,如pow(10,2)=100 |
// | 整除,结果舍去小数点后的部分,如101//10=10 |
% | 取余,如10%3=1 |
使用re正则表达式中的sub方法,第一个参数是正则表达式,第二个参数为target_str。
import re
name=re.sub("\\s+", "_", name)
答:
(1)输入网址并按Enter键,比如访问http://mysite:8080/app/index.html。
(2)浏览器通过域名系统查询mysite的真实IP,比如212.34.98.20。
(3)向服务器212.34.98.20的8080端口发起TCP连接请求并建立连接。
(4)发送HTTP请求的内容,包括访问的地址/app/index.html、访问方式GET、浏览器本身的产品名等。
(5)服务器返回/app/index.html中的数据作为Response发送给客户端。如果请求的不是一个文件,则服务器需要执行相应的代码,动态生成且返回给客户端。
(6)浏览器接收到结果后关闭与服务器的TCP链接。
(7)浏览器将接收到的结果呈现在显示器上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。