L[0,1]切片 相当于substring
L[-1]倒数第一个 L[-2:-1] 倒着切
取奇数
l = [i for i in range(100) if i % 2 == 1]
取前10位数隔两位一输出
print(l[:10:2])
generator生成器
长度不确定,相比较list知道长度,如果100W个就会比较浪费,generator可以根据next(g)来生成
使用方法:
g = (x * x for x in range(10))
next(g)
可以用list(g)来强行取得生成器的所有结果
map(func,Iterable)
对list内所有值进行方法运算
使用方法:
def f(x):
return x * x
map(f,[1,2,3,4,5])
结果:
[1,4,9,16,25]
reduce(func,Iterable)
两个两个进行方法的运算 得到的结果与下一个计算
使用方法:
def add(x, y):
return x + y
reduce(add,[1,2,3])
结果:
add(add(1,2),3)
filter(func,Iterable)
使用方法:
list(filter(not_empty, [‘A’, ‘’, ‘B’, None, ‘C’, ’ ']))
结果:
[‘A’, ‘B’, ‘C’]
因为返回的是一个惰性序列Iterator,所以要用list强行取得所有结果,not_empty为过滤函数
lambda x: x * x
实际上是
def f(x):
return x * x
如
L = list(filter(lambda x: x % 2 == 1, range(1, 20)))
lambda在Java中1.8之后经常用
方法中返回方法
def a():
def b(text):
return text * text
return b;
调用t=a()后t就是方法b
再调用t(2)就是执行了b(2)
这里也存在闭包问题
int(‘12345’, 16)可以用来进制转换
可以定义方法
def int2(x, base=2):
return int(x, base)
__init__方法就是JAVA的构造器
__init__方法的第一个参数永远是self,表示创建的实例本身
变量名如果以__开头就变成了一个私有变量(private)
class Animal(object): 表示继承自object类 python的object类小写不太理解
dir(对象) 可以得到所有属性和方法 可能类似反射?
配合getattr()获取属性、setattr()设置属性以及hasattr()有属性
也可以getattr(obj, ‘z’, 404) # 获取属性’z’,如果不存在,返回默认值404
Python的类可以动态绑定属性,比方类里面没声明的属性可以直接赋值也可以获取
class Application(Frame):
def init(self):
pass
c = Application()
c.name = ‘123’
print(c.name)
这种绑定是基于单个对象的
Application.name = ‘123’
print(c.name)
这种绑定是基于类的
如果在创建类时定义__slots__ = (‘name’, ‘age’) # 用tuple定义允许绑定的属性名称
那只能绑定这两种,绑定其他的属性则会报错,slots__仅对当前类有效,继承无效
子类若也定义,那可绑定的属性就是子类的__slots__加父类的__slots
用装饰器可以动态的加功能,python里面使用比较方便,用
@log
def t():
pass
就相当于执行了log(t)
对属性进行某些限制可以用@property装饰器
@property装饰器就是负责把一个方法变成属性调用的
@property本身又创建了另一个装饰器@xxxx.setter负责把一个setter方法变成属性赋值
只定义getter方法,不定义setter方法就是一个只读属性
Python允许使用多重继承,JAVA类是单继承的,接口可以多继承。
def str(self):
return “”
相当于java重写toString(){};
重写__iter__()_,next_()来应用for…in
重写__getitem__来用下标访问某一项
重写__delitem__()来删除某一项
当访问的属性不存在时会调用__getattr__
例如s = Student(‘Michael’)
s()会调用__call__方法
可以用callable(Student())来判断对象是否能调用,也就是有没有定义_call_方法
异常处理
try:
except xxx as e1:
except xxx as e2:
else:
所有错误类型继承自BaseException
raise XXX 可以抛出错误XXX
如果不带参数就抛出当前错误
python打印日志可以导入内置的logging
import logging
logging.basicConfig(level=logging.INFO) #debug,info,warning,error
import logging
再使用
logging.exception(e)
finally:
使用断言assert n != 0, 'n is zero!'来替换print()进行调试
因为启用Python解释器时可以用python -0 a.py来跳过断言
使用Python自带的unittest模块进行单元测试
编写一个测试类,从unittest.TestCase继承
以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行
使用
if name == ‘main’:
unittest.main()
来进行测试
使用下面的方法在单元测试前后调用,例如打开数据库与关闭数据库
def setUp(self):
print(‘setUp…’)
def tearDown(self):
print('tearDown...')
f = open(’/test.txt’, ‘r’)
打开test文件,r表示只读
要读取二进制文件,比如图片、视频等等,用’rb’模式
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件
f = open(’/gbk.txt’, ‘r’, encoding=‘gbk’)
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
f = open(’/Users/michael/gbk.txt’, ‘r’, encoding=‘gbk’, errors=‘ignore’)来忽略异常
f.read()输出所有内容到内存 str表示
使用完后f.close()关闭资源
try:
f = open(’/file’, ‘r’)
print(f.read())
finally:
if f:
f.close()
相当于
with open(’/path/to/file’, ‘r’) as f:
print(f.read())
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
with open(’/test.txt’, ‘w’) as f:
f.write(‘Hello, world!’)
用try的方法的话一定要记得close文件,java里的.flush()方法差不多,当然java也要close。