之前内容回顾
1、python基础 2、基本数据类型:str、dict、list、tuple、set.. s = "alex" => str # s是创建的一个对象,所有功能被保存在其对应的str的类里 对象是类的实例 isinstance(s, str) ==> True 3、函数式编程 函数定义 内置函数 文件处理 注意: li = [11,22,33,44] def f1(arg): #此函数没有返回值,默认返回None arg.append(55) li = f1(li) # li被重新赋值了,而其返回值为None print(li)# 如果li没有被重新赋值,则li == [11,22,33,44,55] 4、其他 三目运算 lambda表达式 |
内置函数补充
callable() # 查询是否可以被调用 chr() # 将数字转换成对应的ascii码 ord() # 将ascii码转换成数字 abs() # 取绝对值 bool() # 取布尔值 # 0, None, "", [], {}, () # 以上布尔类型值都是False(注意双引号里面没有空格,列表跟字典里面无所谓) bin() #十进制转二进制 oct() #十进制转八进制 hex() #十进制转十六进制 utf-8 一个汉字:三个字节 gbk 一个汉字:两个字节 # 字符串转换成字节类型 # bytes("要转换的字符串",encoding="某种编码格式") |
python file.py 执行文件过程: 1、读取文件内容open,string(字符串形式)到内存 2、python,把字符串 -> 编译 =》特殊代码 3、执行代码 >>> s = "print(123)"#字符串 >>> r = compile(s, "<string>", "exec")#将字符串编译成python代码 #有几种模式single, eval ,exec >>> print(r) #code <code object <module> at 0x0000018F219D2660, file "<string>", line 1> >>> exec(r) #执行 123 >>> #将字符串编译成python代码 compile() #执行python代码,接收:代码(直接执行)或者字符串(先编译再执行);虽然很牛逼,但没有返回值 exec("7+8+9") #执行表达式,并且获取结果(有返回值) ret = eval("7+8+9") print(ret) |
dir(list) #快速查看对象提供了哪些功能 help(dir) #帮助读源码的 #共97条数据,每页显示10条,需要多少页 r = divmod(97, 10) print(r) # (9, 7) 商9余7 # r[0] == 9 && r[1] == 7 #可以这么写: n1, n2 = divmod(97, 10) s = "alex"#用于判断,对象是某个类的实例 isinstance(s, str) ==> True |
ret = filter(函数, 可迭代的对象) # filter内部会循环被迭代的对象,然后执行函数,符合条件的元素就被添加到ret中 # 函数返回值为True,将元素添加到结果中!!! >>> a = [11,22,33,44] >>> ret = filter(lambda x:x>33, a) >>> print(ret) <filter object at 0x000001CE9A862518> >>> print(list(ret)) [44] ret2 = map(函数,可迭代的对象) # map将函数的返回值添加到结果中!!! >>> a = [11,22,33,44] >>> ret2 = map(lambda x:x>11, a)#lambda返回值为bool类型 >>> print(list(ret2)) [False, True, True, True] >>> ret2 = map(lambda x:x+11, a)#lambda返回值为int类型 >>> print(list(ret2)) [22, 33, 44, 55] >>> |
len()在python2.7跟python3.0里面的不同: >>> li = "理解" #python3里面,中文默认是字符来算的 >>> len(li) 2 >>> b = bytes(li, encoding='utf-8') #可以显式的转换成字节 >>> len(b) 6 >>> |
sum([11,22,33,44]) max([11,22,33,44]) min([11,22,33,44]) pow(2, 10)#乘方 =》1024 round(1.2)#四舍五入 li = [11,22,3,4] li.reverse() 《===》reversed(li) #内部执行li.reverse()方法 li.sort() 《===》 sorted(li) |
zip(): #仅限于python3.. >>> l1 = ["Your", 11, 22] >>> l2 = ["are", 22, 33, 55] >>> l3 = ["beautiful", 33, 44] >>> r = zip(l1, l2, l3) >>> print(list(r)) #依次取出每个数组的元素进行组合;如果元素长度不一致会被砍到一样长 [('Your', 'are', 'beautiful'), (11, 22, 33), (22, 33, 44)] >>> print(list(r)) #为啥第二此打印会变成空列表?? [] >>> a, b, c = zip(*[('Your', 'are', 'beautiful'), (11, 22, 33), (22, 33, 44)]) >>> print(a, b, c) # zip(*list)也就是列表前面带个星号,是上述操作的逆操作 ('Your', 11, 22) ('are', 22, 33) ('beautiful', 33, 44) >>> |
反射:(以后补充) delattr(), getattr(), setattr(), hasattr() 迭代器: iter(), next() |
内置函数补充 二
一、map
遍历序列,对序列中每个元素进行操作,最终获取新的序列。
# 每个元素加100 li = [11, 22, 33] new_list = map(lambda a: a + 100, li)
# 两个列表对应元素相加 li = [11, 22, 33] sl = [1, 2, 3] new_list = map(lambda a, b: a + b, li, sl)
二、filter
对于序列中的元素进行筛选,最终获取符合条件的序列
li = [11, 22, 33] # 获取列表中大于12的所有元素集合 new_list = filter(lambda arg: arg > 22, li) # filter第一个参数为空,将获取原来序列
三、reduce
对于序列内所有元素进行累计操作
li = [11, 22, 33] # 获取序列所有元素的和 result = reduce(lambda arg1, arg2: arg1 + arg2, li) # reduce的第一个参数,函数必须要有两个参数 # reduce的第二个参数,要循环的序列 # reduce的第三个参数,初始值
yield生成器
1、对比range 和 xrange 的区别
>>> print range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print xrange(10) xrange(10)
如上代码所示,range会在内存中创建所有指定的数字,而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。
# 自定义生成器nrange def nrange(num): temp = -1 while True: temp = temp + 1 if temp >= num: return else: yield temp
2、文件操作的 read 和 xreadlinex 的的区别
read会读取所有内容到内存 xreadlines则只有在循环迭代时才获取
# 基于next自定义生成器NReadlines def NReadlines(): with open('log','r') as f: while True: line = f.next() if line: yield line else: return for i in NReadlines(): print i
# 基于seek和tell自定义生成器NReadlines def NReadlines(): with open('log','r') as f: seek = 0 while True: f.seek(seek) data = f.readline() if data: seek = f.tell() yield data else: return for item in NReadlines(): print item
装饰器
装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。
#!/usr/bin/env python #coding:utf-8 def Before(request,kargs): print 'before' def After(request,kargs): print 'after' def Filter(before_func,after_func): def outer(main_func): def wrapper(request,kargs): before_result = before_func(request,kargs) if(before_result != None): return before_result; main_result = main_func(request,kargs) if(main_result != None): return main_result; after_result = after_func(request,kargs) if(after_result != None): return after_result; return wrapper return outer @Filter(Before, After) def Index(request,kargs): print 'index' if __name__ == '__main__': Index(1,2)
冒泡算法
需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序
思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!
# 第一步 li = [13, 22, 6, 99, 11] for m in range(4): # 等价于 #for m in range(len(li)-1): if li[m]> li[m+1]: temp = li[m+1] li[m+1] = li[m] li[m] = temp
# 第二步 li = [13, 22, 6, 99, 11] for m in range(4): # 等价于 #for m in range(len(li)-1): if li[m]> li[m+1]: temp = li[m+1] li[m+1] = li[m] li[m] = temp for m in range(3): # 等价于 #for m in range(len(li)-2): if li[m]> li[m+1]: temp = li[m+1] li[m+1] = li[m] li[m] = temp for m in range(2): # 等价于 #for m in range(len(li)-3): if li[m]> li[m+1]: temp = li[m+1] li[m+1] = li[m] li[m] = temp for m in range(1): # 等价于 #for m in range(len(li)-4): if li[m]> li[m+1]: temp = li[m+1] li[m+1] = li[m] li[m] = temp print li
# 第三步 li = [13, 22, 6, 99, 11] for i in range(1,5): for m in range(len(li)-i): if li[m] > li[m+1]: temp = li[m+1] li[m+1] = li[m] li[m] = temp
递归
利用函数编写如下数列:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377
# demo def func(arg1,arg2): if arg1 == 0: print arg1, arg2 arg3 = arg1 + arg2 print arg3 func(arg2, arg3) func(0,1)