Python学习随笔
1.\t 为横向制表符(tab),相当于四个空格的距离。
2.python中返回None的情况:
1).通过dict提供的get(),如果key不存在,返回None。
3.解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
#会有栈溢出
def fact(n):
return fact_iter(n, 1)
#解决栈溢出
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
4.python中一边循环一边计算的机制,称为生成器(generator)。快速创建一个生成器的方法。
g = (x*x for x in range(10))
- 'slots’变量是为了达到限制的目的,Python允许在定义class的时候,定义的一个特殊的变量。其只对当前类起作用,对继承的子类不起作用!
class Student(object):
slots = (‘name’,‘age’) # 用tuple定义允许绑定的属性名称
5.字典推导式
{i:i+1 for i in range(10)}
6.python内建的高级函数:
1)filter
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', '']))
# 结果: ['A', 'B', 'C']
filter()函数返回的是一个Iterator,也就是一个惰性序列,所以用list函数强迫filter()完成计算!
2)reduce
reduce()函数作用在一个序列上,其必须接受两个参数。
from functools import reduce
def add(x, y):
return x + y
# lambda x,y:x+y
reduce(add, [1, 3, 5, 7, 9])
7.一个字符串中如果用单引号表示,内部还有单引号的时候需要转义。
'GAN's not %s %%' %'unix' # 错误写法
'GAN\'s not %s %%' %'unix' # 正确写法
“GAN's not %s %%” %'unix' # 正确写法
8.mysql中的优先级由高到低为:小括号,not,比较运算符,逻辑运算符
9.在Python中,以下划线开头的变量名有特殊的含义,尤其是在类的定义中。用下划线作为变量前缀和后缀来表示类的特殊成员:
l _xxx:这样的对象叫做保护变量,不能用’from module import *'导入,只有类对象和子类对象能访问这些变量;
l xxx:系统定义的特殊成员名字;
l xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过“对象名._类名xxx”这样的特殊方式来访问。Python中没有纯粹的C++意义上的私有成员。
10.eval()函数,将字符串str当成有效的表达式来求值并返回计算结果。
11.python的垃圾回收机制:
1)使用引用计数来跟踪和回收垃圾
2)在引用计数的基础上,通过标记-清除解决容器对象可能产生的循环引用的问题
3)通过分代回收以空间换取时间的方法提高回收率。
12.python自省:
自省就是面向对象的语言所写的程序在运行时,就能知道对象的类型,简单一句就是运行时能够获取对象的类型。比如type()、getattr()、hasattr()、isinstance()
13.文件的操作:
1)获取当前的读写位置:使用tell()来获取
# 打开⼀个已经存在的⽂件
f = open("test.txt", "r")
str = f.read(3)
print "读取的数据是 : ", str
# 查找当前位置
position = f.tell()
print "当前⽂件位置 : ", position
str = f.read(3)
print "读取的数据是 : ", str
# 查找当前位置
position = f.tell()
print "当前⽂件位置 : ", position
f.close()
2) 定位到某个位置:
如果在读写⽂件的过程中,需要从另外⼀个位置进⾏操作的话,可以使⽤seek()
seek(offset, from)有2个参数
offset:偏移量
from:⽅向
0:表示⽂件开头
1:表示当前位置
2:表示⽂件末尾
14.进程与线程
1)主线程会等待子线程执行完毕之后再退出。
2) 主进程会等待子进程执行完毕后再退出,但是前提是子进程是通过multiprocessing.Process()产生的,而不是通过进程池批量产生的子进程。后者的产生子进程主进程是不会等待的。
15.os与sys模块的区别
首先两者都是针对函数而言的。os模块提供了一种方便使用操作系统函数的方法;sys提供访问由解释器使用和维护的变量与解释器进行交互的函数
16.json模块的使用
json.dumps()与json.loads()
前者将obj转化为json str,后者将str转化为python对象,如果json字符串是个object,转化为dict,若是array则转化为list。
17.字符串join方法的使用:
#内部元素必须为字符串
list = ['0','1','2','3','4']
str = ''.join(list)
print(str)
18.python的内置函数-vars
(1) 当函数不接收参数时,其功能和locals函数一样,返回当前作用域内的局部变量。
>>> v1 = vars()
>>> l1 = locals()
>>> v1
{'__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'v1': {...}, 'l1': {...}, '__spec__': None, '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>}
>>> l1
{'__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'v1': {...}, 'l1': {...}, '__spec__': None, '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>}
(2) 当函数接收一个参数时,参数可以是模块、类、类实例,或者定义了dict属性的对象。
>>> import time
>>> vars(time)
19. -u 在Python中的使用
python的输出有缓冲,导致log并不能够马上看到输出。
-u参数,使得python不启用缓冲。
所以修改命令即可:nohup python -u test.py > log &