-
Teacher 继承 Student 时,__init__()括号中需要写被继承类的全部参数, super(Teacher, self).__init__(name, gender)报错是因为缺少了Student的score参数; t = Teacher('Alice', 'Female', 'English') Teacher继承Student的三个参数后又定义了course参数,共4个参数,这个地方少了一个参数
查看全部 -
有参数的decorator
在外面套一层专门接收参数的函数
例:
请给 @performace 增加一个参数,允许传入's'
import time from functools import reduce def performance(prefix): def performance_decorator(f): def fn(*args, **kwargs): t1 = time.time() f(*args, **kwargs) t2 = time.time() print('函数f运行时间是{}{}'.format(t2 - t1,prefix)) return fn return performance_decorator @performance('s') def f(list_): return reduce(lambda x,y: x*y, list_) f(list(range(1,10000)))
解释:
def performance(参数):
def performance_decorator(函数f):
...
return performance_decorator
performance_decorator = performance(参数)
新函数 = performance_decorator(原函数)
查看全部 -
装饰器的作用:
给原函数装饰装饰变成新函数
装饰器的语法:
@+装饰器函数名
例:
编写一个decorator计算函数的运行时间
import time from functools import reduce def performance(f): def fn(*args, **kwargs): t1 = time.time() f(*args, **kwargs) #接收函数用*args,**kwargs;在函数中用args,kwargs t2 = time.time() print('函数f运行时间是{}s'.format(t2 - t1)) return fn @performance def f(list_): return reduce(lambda x,y: x*y, list_) f(list(range(1,100000))) ==>函数f运行时间是2.1856231689453125s
解释:
将函数f作为参数传给函数performance
函数performance接收原函数f
在函数performance中定义新函数fn,新函数的参数用来接收原函数的参数,一般设为*args,**kwargs可接收任何形式参数
装饰原函数
返回新函数fn
查看全部 -
def calc_sum(list_): def lazy_sum(): return sum(list_) return lazy_sum f = calc_sum([1, 2, 3, 4]) f() ==>10
闭包:
内层函数引用外层函数的变量(参数也算是变量),最后外层函数返回内层函数
那么这个内层函数就是一个闭包(类似打包返回)
错误写法:
# 希望一次返回3个函数,分别计算1x1,2x2,3x3: def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() #内层函数只被定义还没运行,此时外层函数运行完毕i=3 f1()==>9 #运行内层函数 f2()==>9 f3()==>9
正确写法:
def count(): fs=[] for i in range(1,4): def g(j=i): #为内层函数设置形参默认值 return j*j fs.append(g) return fs f1,f2,f3=count() print(f1(),f2(),f3())
在Python中,函数形参默认值是指在定义函数时为形参指定的默认值,在调用函数时,如果没有为该形参提供实际的参数值,函数会使用默认值
查看全部 -
Python在函数内部定义子函数,并把子函数返回
def f(): def g(): return ... return g x = f() x()
函数名g就是指向函数g的变量
不加小括号就只是一个变量,加上小括号才能调用函数
查看全部 -
匿名函数
lambda 参数 : 表达式
可以有多个参数,但只能有一个表达式,返回值就是表达式的结果
例:
map(lambda x:x*x,[1,2,3,4]) reduce(lambda x,y:x*y,[1,2,3,4]) sorted(['bob', 'about', 'Zoo', 'Credit'],key=lambda x:x.lower())
查看全部 -
sorted(list, (key=函数对象f, reverse=True)) 默认从小到大排序
函数f的作用:
接受待排序列表的元素作为参数传入函数f,并返回真正需要排序的字段
例1:
(姓名,成绩)按成绩进行排序
def f(item): return item[1] print(sorted([('Alice', 72), ('Candy', 90), ('Bob', 62)],key=f)) ==>[('Bob', 62), ('Alice', 72), ('Candy', 90)]
例2:
对字符串忽略大小写进行排序
def f(item): return item.lower() print(sorted(['bob', 'about', 'Zoo', 'Credit'],key=f)) ==>['about', 'bob', 'Credit', 'Zoo']
查看全部 -
filter(函数f, list)将函数f作用到list的每个元素上,对元素进行判断,筛选出为True的元素(以迭代器形式)
例1:
利用filter()函数,删除 None 或者空字符串
def is_not_empty(s): return s and s.strip() for item in filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']): print(item)
str.strip()删除字符串str中的空白字符
例2:
利用filter()过滤出1~100中平方根是整数的数
import math def sqrt_is_int(n): # 解题思路:如果将一个数的平方根的整数部分再平方仍然等于这个数,则他的平方根一定是整数 return int(math.sqrt(n))*int(math.sqrt(n)) == n for item in filter(sqrt_is_int,list(range(1,101))): print(item) # math.sqrt()的结果是float # float*float结果可能是int
查看全部 -
reduce(函数f, list)对list的元素顺序累(积/加...)
函数f必须接收两个参数
例:
Python内置了求和函数sum(),但没有求积的函数,请利用recude()来求积
from functools import reduce def f(x,y): return x*y print(reduce(f,[1,3,5,7,9])) ==> f(1,3) f(3,5) f(15,7) f(105,9) 945
查看全部 -
map(函数f, list) 把函数f作用在list的每一个元素上
例:
请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字(首字母大写,后续字母小写)的list:
输入:['alice', 'BOB', 'CanDY']
输出:['Alice', 'Bob', 'Candy']def f(s): return s[0].upper() + s[1:].lower() for item in map(f,['alice', 'BOB', 'CanDY']): print(item) ==> Alice Bob Candy
str.lower()将字符串str变成小写
str.upper()将字符串str变成大写
注意:
1. 字符串切片会得到一个子字符串
2. 字符串的不可变性,不能在原字符串上修改某个索引位置
查看全部 -
请从页面返回的内容中,过滤出链接含有www的内容。
import requests from bs4 import BeautifulSoup url = "https://www.imooc.com" response = requests.get(url) if response.status_code == 200: # 使用BeautifulSoup解析页面内容 soup = BeautifulSoup(response.text, 'html.parser') #'html.parser'是HTML解析器 # 找到所有的链接 links = soup.find_all('a') #使用find_all()来查找特定标签find_all() # 筛选出包含'www'的链接 www_links = [link['href'] for link in links if link.get('href')!=None and 'www' in link['href']] #以字典形式传入属性得到属性值 for link in www_links: print(link) else: print("Failed to retrieve the webpage")
查看全部 -
网络通信
server.py
import socket server = socket.socket() #创建server server.bind(('127.0.0.1',8999)) #绑定IP和端口 127.0.0.1是本机回环IP server.listen(5) #监听端口(端口的最大连接数量) s , client_info = server.accept() #接受连接,返回一个新的socket代理这个连接,和客户端的信息(IP,端口) data = s.recv(1024) #接收数据(最大字节数) while 1: data_append = s.recv(1024) if str(data_append,'utf-8') == 'end': print(str(data,'utf-8')) data = b'' else: data += data_append
client.py
import socket client = socket.socket() #创建client client.connect(('127.0.0.1',8999)) #连接server while 1: data = input('echo>>>') client.send(bytes(data,'utf-8')) #发送bytes
查看全部 -
常用模式怎么记?
前操作,后文件格式,默认文本格式
r,rb
w,wb
a,ab
查看全部 -
一般使用close()关闭文件,但如果在close()之前,程序异常退出了,那么文件就得不到正确的关闭,就会造成文件损坏,文件内容丢失的问题
with关键字:
会确保不管在使用过程中是否发生异常,都会执行必要的“清理”的操作,释放资源,比如文件使用后自动关闭等等。
查看全部 -
seek(index)移动文件中的游标位置
index:0 文件首部 index:2 文件尾部
注意:
往文件中写完内容后,游标会在文件尾部,如果之后想读取文件内容,需要把游标移动到文件首部,否则读取不到任何内容
with open('requirements.txt','a') as f: f.write('aaa\n') print(f.readlines()) ==>io.UnsupportedOperation: not readable
查看全部
举报