今天学习内容如下:
1.通常C/C++中,"/ " 算术运算符的计算结果是根据参与运算的两边的数据决定的,比如:6 / 3 = 2 ; 6,3都是整数,那么结果也就是整数2;6.0 / 3.0 = 2.0 ; 6.0,3.0是浮点数,那么结果也是浮点数2.0,跟精确的说,只要" / " 两边有一个数是浮点数,那么结果就是浮点数在Python2.2版本以前也是这么规定的,但是,Python的设计者认为这么做不符合Python简单明了的特性,于是乎就在Python2.2以及以后的版本中增加了一个算术运算符" // "来表示整数除法,返回不大于结果的一个最大的整数,而" / " 则单纯的表示浮点数除法,但是,为了折中,所有2.X版本中,也是为了向后兼容,如果要使用" // ",就必须加上一条语句:from __future__ import divisio一看到这句," / "就表示 浮点数除法,返回浮点结果;" // "表示整数除法。但是,预计在Python3.0发布时,就没有这种折中情况了,," / "就一定表示 浮点数除法,返回浮点结果;" // "表示整数除法
2.复习进度条
import time for i in range(0,101,2): time.sleep(0.1) char_num = i//2 per_str = ' %s%% : %s ' %(i, '*' * char_num) #此处作用是字符串太长换行 if i == 100 else ' %s%% :%s' %(i,'*'*char_num)# print(per_str,end ='',flush = True) print(123) # for i in range(10): # # s = 'ss%s '%i # print(s,end = '')
3.内置函数
# exec('print(123)') # eval('print(123)') # print(eval('1+2+3'))# 有返回值6 # print(exec('1+2+3'))#没有返回值None # exec和eval都可以执行 字符串类型的代码 # eval有返回值 —— 有结果的简单计算 # exec没有返回值 —— 简单流程控制 # eval只能用在你明确知道你要执行的代码是什么 # code = '''for i in range(10): # print(i*'*')''' # exec(code) # code = 'for i in range(10):print(i)' # # compilel = compile(code,'','exec') # # exec(compile) # exec(code) # code = '1 + 2 + 3' # compile2 = compile(code,'','eval') # print(eval(compile2)) # eval(compile2) # print(eval(code)) # # name #执行后name变量有值 # "'pythoner'" # 复数 —— complex # 实数 : 有理数 # 无理数 # 虚数 :虚无缥缈的数 # 5 + 12j === 复合的数 === 复数 # 6 + 15j # 浮点数(有限循环小数,无限循环小数) != 小数 :有限循环小数,无限循环小数,无限不循环小数 # 浮点数 #354.123 = 3.54123*10**2 = 35.4123 * 10 # f = 1.781326913750135970 # print(f) # print(bin(10)) # print(oct(10)) # print(hex(10)) # print(abs(-3)) # print(divmod(2,3))# div除法 mod取余 # print(divmod(3,5)) # print(round(2.4545)) # print(round(2.8546655444,5)) # print(pow(2,5)) # print(pow(5,4)) # print(pow(1,4,1)) # print(pow(2,4,2))#前两个数幂运算除以三个数取余 # ret = sum([1,2,3,4,5,6],10) # print(ret) print(min(1,2,3,4)) print(min(1,2,3,4,-3)) print(min(1,2,3,4,-3,key = abs)) print(min([1,2,3,4])) print(max(1,2,3,4)) print(max(1,2,3,4,-3)) print(max(1,2,3,4,-3,key = abs)) print(max([1,2,3,4]))
# list = [1,2,3] # l = list.reverse() # print(l) # # print(list) # list = [1,2,3] # l = reversed(list) # print(l) # print(l.__next__()) # l = [1,2,3,4,4,5,8] # s = slice(1,7,2) # print(s) # print(l[s]) # print(l[1:7:2]) # print(format('test', '<10')) # print(format('test', '>40')) # print(format('test', '^40')) # 网络编程 只能传二进制 # 照片和视频也是以二进制存储 # html网页爬取到的也是编码 # b_array = bytearray('你好',encoding = 'utf-8') # print(b_array) # print(b_array[0]) # b_array[1]=255 # print(b_array) # print(ord('a')) # print(ord('1')) # print(chr(97)) # print(ord('好')) print(repr(1)) print(str(1)) print(repr('1')) print(str('1')) name = 'egg' print('你好%r'%name) name = 'egg' print('你好%s'%name)
# print(all(['a','','e'])) # print(all(['a','e'])) # print(all(['','e'])) # # print(any(['a','','e'])) # print(any(['a','e'])) # print(any([0,'e'])) # # l = [1,2,3,4] # s = [1,2,3,4] # m = [1,2,3,[4,5]] # n = {1:2,3:4} # for i in zip(l,s,m,n): # print(i) # # def func(x): # # return x % 2 == 1 # if x > 10: # return x # ret = filter(func,[1,23,4,5]) # print(ret) # for i in ret: # print(i) # def is_not_empty(s): # return s and len(s.strip()) > 0 # ret = filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']) # print(ret) # for i in ret: # print(i) # filter 执行了filter之后的结果集合 <= 执行之前的个数 #filter只管筛选,不会改变原来的值 # map 执行前后元素个数不变 # 值可能发生改变 # from math import sqrt # def func(num): # res = sqrt(num) # return res % 1 == 0 # ret = filter(func,range(1,101)) # for i in ret: # print(i) # ret = map(abs,[12,-3,4,5]) # print(ret) # for i in ret: # print(i) # l = [1,23,4,-5,-6,6] # # print(l.sort(key = abs)) # 在原列表的基础上进行排序 # # print(l) # # print(sorted(l,key = abs,reverse = True))# 生成了一个新列表 不改变原列表 占内存 # print(l) l = [' ', '2','34','dfsdsdffsd'] print(sorted(l,key = len))
4.匿名函数
# def add(x,y): # return x+y # add = lambda x,y:x+y # print(add(1,2)) # # dic = {'key1':1,'key2':20,'key3':3} # print(max(dic,key = lambda a:dic[a])) #两道练习题目 # 1.下面程序的输出结果是: # d = lambda p:p*2 # t = lambda p:p*3 # x = 2 # x = d(x) # x = t(x) # x = d(x) # print(x) # 2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}] # ret = zip(('a','b'),(('c'),('d'))) # # def func(x): # # return {x[0]:x[1]} # res = map(lambda x:{x[0]:x[1]},ret) # # for i in ret: # # print(i) # print(list(res)) # 3.以下代码的输出是什么?请给出答案并解释。 # def multipliers(): # return [lambda x:i*x for i in range(4)] # print([m(2) for m in multipliers()]) # 请修改multipliers的定义来产生期望的结果。 def func(): return 'ss'*i for i in range(4): func() print(func()) # def multipliers(): # return [lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x] # print([m(2) for m in lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x]) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return dic[key] # print(max(dic,key=func)) #根据返回值判断最大值,返回值最大的那个参数是结果 # print(max(dic,key=lambda key:dic[key])) # max([1,2,3,4,5,-6,-7],key=abs) # ret = map(abs,[-1,2,-3,4]) # for i in ret: # print(i) # def func(x): # return x**2 # ret = map(func,[-1,2,-3,4]) # for i in ret: # print(i) # # ret = map(lambda x:x**2,[-1,2,-3,4]) # def func(x): # return x>10 # # res = filter(func,[5,8,11,9,15]) # for i in res: # print(i) # min max filter map sorted —— lambda # d = lambda p:p*2 # t = lambda p:p*3 # x = 2 # x = d(x) #x = 4 # x = t(x) #x = 12 # x = d(x) #x = 24 # print(x) # ret = zip((('a'),('b')),(('c'),('d'))) # ret = map(lambda t:{t[0]:t[1]},ret) # print(list(ret)) #现有两元组(('a'),('b')),(('c'),('d')), # 请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}] # max min sorted filter map # 匿名函数 == 内置函数 # zip # ret = zip((('a'),('b')),(('c'),('d'))) # res = map(lambda tup:{tup[0]:tup[1]},ret) # print(list(res)) # def multipliers(): # return [lambda x:i*x for i in range(4)] # print([m(2) for m in multipliers()])
5.练习题
# 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao','nezha'] # def func(item): # return item+'_sb' # ret = map(func,name) #ret是迭代器 # for i in ret: # print(i) # print(list(ret)) # ret = map(lambda item:item+'_sb',name) # print(list(ret)) # 4.用filter函数处理数字列表,将列表中所有的偶数筛选出来 # num = [1,3,5,6,7,8] # def func(x): # if x%2 == 0: # return True # ret = filter(func,num) #ret是迭代器 # print(list(ret)) # # ret = filter(lambda x:x%2 == 0,num) # ret = filter(lambda x:True if x%2 == 0 else False,num) # print(list(ret)) # 5.随意写一个20行以上的文件 # 运行程序,先将内容读到内存中,用列表存储。 # 接收用户输入页码,每页5条,仅输出当页的内容 # with open('file',encoding='utf-8') as f: # l = f.readlines() # page_num = int(input('请输入页码 : ')) # pages,mod = divmod(len(l),5) #求有多少页,有没有剩余的行数 # if mod: # 如果有剩余的行数,那么页数加一 # pages += 1 # 一共有多少页 # if page_num > pages or page_num <= 0: #用户输入的页数大于总数或者小于等于0 # print('输入有误') # elif page_num == pages and mod !=0: #如果用户输入的页码是最后一页,且之前有过剩余行数 # for i in range(mod): # print(l[(page_num-1)*5 +i].strip()) #只输出这一页上剩余的行 # else: # for i in range(5): # print(l[(page_num-1)*5 +i].strip()) #输出5行 # 6.如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格 # portfolio = [ # {'name': 'IBM', 'shares': 100, 'price': 91.1}, # {'name': 'AAPL', 'shares': 50, 'price': 543.22}, # {'name': 'FB', 'shares': 200, 'price': 21.09}, # {'name': 'HPQ', 'shares': 35, 'price': 31.75}, # {'name': 'YHOO', 'shares': 45, 'price': 16.35}, # {'name': 'ACME', 'shares': 75, 'price': 115.65} # ] # 6.1.计算购买每支股票的总价 # ret = map(lambda dic : {dic['name']:round(dic['shares']*dic['price'],2)},portfolio) # print(list(ret)) # 6.2.用filter过滤出,单价大于100的股票有哪些 # ret = filter(lambda dic:True if dic['price'] > 100 else False,portfolio) # print(list(ret)) # ret = filter(lambda dic:dic['price'] > 100,portfolio) # print(list(ret))
6.递归函数
初识递归
递归的定义——在一个函数里再调用这个函数本身
现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。
刚刚我们就已经写了一个最简单的递归函数。
def story(): print('sdf') story() story()
递归的最大深度——997
正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997
我们可以通过这种方式来修改递归的最大深度
import sys sys.setrecursionlimit(500) def foo(n): print(n) n += 1 foo(n) foo(1)
7.二分查找算法
# 我们学习的算法 都是过去时
# 了解基础的算法 才能创造出更好的算法
# 不是所有的事情都能套用现成的方法解决的
# 有些时候会用到学过的算法知识来解决新的问题
# 二分查找算法 必须处理有序的列表
# l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
# 5000000 4999998
# 代码实现
# 二分查找算法 必须处理有序的列表 l = [1,2,3,4,5,6,7,8,9,10] def find(l,aim): mid_index = len(l)//2 if l[mid_index] < aim: new_1 = l[mid_index+1 :] find(new_1,aim) elif l[mid_index] > aim: new_1 = l[:mid_index] find(new_1,aim) else: print('找到了',mid_index,l[mid_index]) find(l,4)
def find(l,aim,start = 0,end = None): end = len(l) if end is None else end mid_index = (end -start)//2+start if start <= end: if l[mid_index] < aim: return find(l,aim,start = mid_index+1,end = end) elif l[mid_index] > aim: return find(l, aim, start=start, end=mid_index-1) else: return mid_index else: print('找不到') l = [1,2,3,4,5,6,7,8,9] t = find(l,5) print(t) # print(l.index(4))
8.菲波那切数列
def fib(n): if n == 1 or n == 2: return 1 return fib(n-1) + fib(n-2) print(fib(50))
9.阶乘
def func(n): if n == 1: return 1 return n*func(n-1) print(func(5))