前言
原来视频的老师都是布置大作业,没有布置小作业。新视频的老师有布置小作业,感觉这种小作业对于巩固基础知识有很大的作用,所以顺手做了。
小作业
1.传入多个数字,求和。
2. 判断两个数字较小的一个。
3. 函数:输入1个可迭代对象,将里面的元素以_相连拼接成字符串。
4. 写函数,传入n个值,返回字典{max='',min=''}。
5. 写函数,输入n,返回n的阶乘。
6. 写函数返回一个扑克牌列表,每一项都是一个元组,需要用到笛卡尔积。
7. 打印9*9乘法表。(这个曾经自己在小学的时候用vb写出来过,但是当时没意识到自己有这个天赋。。。。)
代码
#1.传入多个数字,求和 #法1 def sum_func(*args): sum = 0 for i in args: sum += i return sum print(1,sum_func(1,2,3,4,5,6,7,8,9,10)) #法2 def sum1_func(*args): return sum(args)#法二2,3,4,5,6,7,8,9,10)) #2.判断两个数字较小的一个 def judge(a,b): return a if a<b else b print(2,judge(1,2)) #3. 函数:输入1个可迭代对象,将里面的元素以_相连拼接成字符串 def join1(lst): s = '' for element in lst: s = s + str(element) + '_' return s.strip('_') lst = [1,'negu','无敌','python'] print(3,join1(lst)) #4.写函数,传入n个值,返回字典{max='',min=''} def judge_2(*args): max_value = max(args) min_value = min(args) dic = {'max':max_value,'min':min_value} return dic print(4,judge_2(*[1,2,3,4,5])) #5. 写函数,输入n,返回n的阶乘. def factorial(n): sum = 1 while True:#直接写n>=1即可 if n>0: sum *= n n -=1 elif n == 0: break else: print('minus is not allowed') return 'error' return sum print(5,factorial(5)) #6. 写函数返回一个扑克牌列表,每一项都是一个元组,需要用到笛卡尔积. def pocker(): pocker_1 = [] huase = ['黑桃','红心','方块','草花'] dianshu = [2,3,4,5,6,7,8,9,10,'j','q','k','a','2'] for i in huase: for e in dianshu: pocker_1.append((i,e)) return pocker_1 print(6,pocker()) def extendlist(val,list=[]):#若默认参数可变的数据类型,函数加载的时候就被定义了,那么每次执行都不会给它分配新的存储空间.只有变量每次运行完函数会消亡. list.append(val) return list list1=extendlist(10) list2 = extendlist(10,[]) list3 = extendlist('c')#list1和3指向同一个列表(list默认值被修改),而list不使用默认值新创建了一个列表. print('list1=%s'%list1) print('list2=%s'%list2) print('list3=%s'%list3) #7.打印9*9乘法表 def multiplication(): for i in range(10): for t in range(1,i+1): print('%s*%s='%(i,t),i*t,end=' ') print('') multiplication()
闭包
闭包:在内层函数中访问外层函数的变量
闭包的作用:
1.可以保护你的变量不受侵害
2.让一个变量常驻内存
例子
a = 10#此时变量不安全,容易被函数的global改变. def outer(): a = 10#此时变量安全,无法在另一个函数中改。对外界是不开放的。 def inner(): nonlocal a a = 20 print(a) return inner#保证a常驻内存 outer()()#inner什么时候调用不确定,必须保证a常驻内存,为了inner执行的时候a有值.
闭包应用例子-超简易爬虫
from urllib.request import urlopen def outter(): s = urlopen('http://www.baidu.com/').read()#常驻内存,第一次拿很慢,后面拿就快了。 def getcontent():#闭包 return s#读出一堆数据 return getcontent#保证s常驻内存 #pa = outter()#如果网站更新得重新跑一次这个 pa()
查看是否闭包
#查看爬虫是否闭包 def outter(): a = 10 def inner(): print('我是inner') #print(a) print(inner.__closure__)#查看是否闭包的函数 outter()#输出none,说明inner不是闭包
迭代器拾遗
迭代器一些概念
-
所有带iter是可以使用for循环的.称之为可迭代对象。
-
所有可迭代对象可通过iter获取迭代器。
-
迭代器里面的可执行语句里有next,iter。
展示
diedaiqi = 'dadadada'.__iter__() print(1,dir(diedaiqi))#有__iter__和__next__
迭代器的基本特质
1.只能向前不能向后
2.几乎不占用内存,节省内存(和生成器处知识链接)
3.可用for循环提取数据
4.惰性机制(面试题,难度系数较高)
迭代器模拟for循环
#迭代器模拟for循环 lst = ['a','b','c','d'] for el in lst:#底层用的是迭代器 print(el) 相当于 it = lst.__iter__() while 1: try: el = it.__next__() print(el) except StopIteration: break
迭代器的判断
#法1
#可以通过dir来判断数据是否可迭代的,以及数据是否是迭代器(__next__ in dir(xx))野路子 #法2 #判断迭代器和迭代对象,官方方案. from collections import Iterator from collections import Iterable print(3,isinstance(it,Iterable))#判断某个对象是不是某个实例。(华为t30为手机的一个实例). list(参数)会把参数进行循环迭代 s = list(diedaiqi)#相当于将迭代器转化成列表,在list函数中一定存在for循环->一定存在__next__ print(s)#['d','a','d','a','d','a'.....]