包含python封装函数实例的词条

Python中冷门但非常好用的内置函数Python中有许多内置函数,不像print、len那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性
Counter
collections在python官方文档中的解释是High-performance container datatypes,直接的中文翻译解释高性能容量数据类型 。这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择 。在python3.10.1中它总共包含以下几种数据类型:
容器名简介
namedtuple() 创建命名元组子类的工厂函数
deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counter 字典的子类,提供了可哈希对象的计数功能
OrderedDict 字典的子类,保存了他们被添加的顺序
defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict 封装了字典对象,简化了字典子类化
UserList 封装了列表对象,简化了列表子类化
UserString 封装了字符串对象,简化了字符串子类化
其中Counter中文意思是计数器,也就是我们常用于统计的一种数据类型,在使用Counter之后可以让我们的代码更加简单易读 。Counter类继承dict类,所以它能使用dict类里面的方法
举例
#统计词频
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
result = {}
for fruit in fruits:
if not result.get(fruit):
result[fruit] = 1
else:
result[fruit]= 1
print(result)
#{'apple': 2, 'peach': 3, 'lemon': 1}下面我们看用Counter怎么实现:
from collections import Counter
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
c = Counter(fruits)
print(dict(c))
#{'apple': 2, 'peach': 3, 'lemon': 1}显然代码更加简单了,也更容易阅读和维护了 。
elements()
返回一个迭代器 , 其中每个元素将重复出现计数值所指定次 。元素会按首次出现的顺序返回 。如果一个元素的计数值小于1,elements()将会忽略它 。
c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']most_common([n])
返回一个列表,其中包含n个最常见的元素及出现次数,按常见程度由高到低排序 。如果n被省略或为None,most_common()将返回计数器中的所有元素 。计数值相等的元素按首次出现的顺序排序:
Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]这两个方法是Counter中最常用的方法 , 其他方法可以参考 python3.10.1官方文档
实战
Leetcode 1002.查找共用字符
给你一个字符串数组words,请你找出所有在words的每个字符串中都出现的共用字符(包括重复字符),并以数组形式返回 。你可以按任意顺序返回答案 。
输入:words = ["bella", "label", "roller"]
输出:["e", "l", "l"]
输入:words = ["cool", "lock", "cook"]
输出:["c", "o"]看到统计字符,典型的可以用Counter完美解决 。这道题是找出字符串列表里面每个元素都包含的字符,首先可以用Counter计算出每个元素每个字符出现的次数 , 依次取交集最后得出所有元素共同存在的字符,然后利用elements输出共用字符出现的次数
class Solution:
def commonChars(self, words: List[str]) - List[str]:
from collections import Counter
ans = Counter(words[0])
for i in words[1:]:
ans = Counter(i)
return list(ans.elements())提交一下,发现83个测试用例耗时48ms,速度还是不错的
sorted
在处理数据过程中 , 我们经常会用到排序操作,比如将列表、字典、元组里面的元素正/倒排序 。这时候就需要用到sorted(),它可以对任何可迭代对象进行排序 , 并返回列表
【包含python封装函数实例的词条】 对列表升序操作:
a = sorted([2, 4, 3, 7, 1, 9])
print(a)
# 输出:[1, 2, 3, 4, 7, 9]对元组倒序操作:
sorted((4,1,9,6),reverse=True)
print(a)
# 输出:[9, 6, 4, 1]使用参数:key,根据自定义规则,按字符串长度来排序:
fruits = ['apple', 'watermelon', 'pear', 'banana']
a = sorted(fruits, key = lambda x : len(x))
print(a)
# 输出:['pear', 'apple', 'banana', 'watermelon']all
all() 函数用于判断给定的可迭代参数iterable中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False 。元素除了是 0、空、None、False外都算True 。注意:空元组、空列表返回值为True 。
all(['a', 'b', 'c', 'd']) # 列表list,元素都不为空或0
True
all(['a', 'b', '', 'd']) # 列表list,存在一个为空的元素
False
all([0, 1,2, 3]) # 列表list,存在一个为0的元素
False
all(('a', 'b', 'c', 'd')) # 元组tuple,元素都不为空或0
True
all(('a', 'b', '', 'd')) # 元组tuple,存在一个为空的元素
False
all((0, 1, 2, 3)) # 元组tuple,存在一个为0的元素
False
all([]) # 空列表
True
all(()) # 空元组
Trueany函数正好和all函数相反:判断一个tuple或者list是否全为空,0,False 。如果全为空,0,False , 则返回False;如果不全为空,则返回True 。
F-strings
在python3.6.2版本中,PEP 498提出一种新型字符串格式化机制,被称为 “字符串插值” 或者更常见的一种称呼是F-strings,F-strings提供了一种明确且方便的方式将python表达式嵌入到字符串中来进行格式化:
s1='Hello'
s2='World'
print(f'{s1} {s2}!')
# Hello World!在F-strings中我们也可以执行函数:
def power(x):
return x*x
x=4
print(f'{x} * {x} = {power(x)}')
# 4 * 4 = 16而且F-strings的运行速度很快,比传统的%-string和str.format()这两种格式化方法都快得多,书写起来也更加简单 。
本文主要讲解了python几种冷门但好用的函数,更多内容以后会陆陆续续更新~
使用python简单封装selenium常用函数 年前走查脚本代码时,发现大家对selenium功能都在重复造轮子,而且容易出现一些常见低级bug 。于是在闲暇之余,封装一些常用的selenium功能 。
在某些网页中,存在多个frame嵌套 。而selenium提供的find_element函数只能在当前frame中查找,不能切换到其他frame中,需要从最上级frame中逐步切换(当然也可以指定xpath的绝对路径,但是一般没人这么做) 。在我们写代码过程中,需要明确知道当前frame位置和需要寻找元素的frame位置 。在frame切换过程中,容易因为疏忽导致frame切换错误导致元素无法找到的bug 。
页面中分布的frame,可以理解为树状结构 。因此我们可以采用递归的方式,沿着某条搜索路线frame节点,依次对树中每个节点均做一次访问 。
我们以163网址上的登录框为例:点击登录按钮,弹出登录iframe页面 。输入框位置在iframe中,因此我们不能使用xpath获取元素位置,需要进入iframe中,然后获取元素 。
手动切换ifame可能会产生bug,因此需要一套自动切换和检索frame的机制 。具体代码如下:
需要注意的是:如果页面中多个frame中 , 存在相同的xpath元素 。还是需要指定frame的路径,否则会返回搜索到的第一个元素 。
强制等待
直接调用系统time.sleep函数,不管页面加载情况一定会等待指定的时间, 即使元素已被加载。
1.如果设置的时间较长 , 会浪费时间
2.如果设置的时间较短,元素可能没有加载 。
页面中某元素如果未能立即加载,隐式等待告诉WebDriver需等待一定的时间,然后去查找元素 。默认不等待,隐式等待作用于整个WebDriver周期,只需设置一次即可 。
1.在上文的find_element函数中,采用递归方式在所有frame寻找元素 。若采用隐式等待,则在每个frame中都需要等待设定的时间,耗时非常长 。
2.某些页面我们想要的元素已经加载完毕,但是部分其他资源未加载 。隐式等待必须等待所有元素加载完毕,增加额外等待时间 。
显示等待一般作用于某一个元素 , 在设定的时间范围内,默认每间隔0.5秒查找元素 。返回被加载的元素,若超过设定的时间范围未能查找则报错 。显示等待作为selenium常用的等待机制,我们来看下他的源码和机制 。
driver 注释中解释为WebDriver实例 , 但是代码中并未有相关检测,因此可以传入任何对象
但是__repr__函数中使用到session_id属性 , 如果需要显示属性或者转为str对象,最好在driver对象中添加session_id属性
在until函数中 , 我们可以看到driver对象传入method函数 。在计时结束前 , 在不断循环执行method函数 , 如果method函数有正常返回值则退出循环,否则报TimeoutException错误 。
可以采用装饰器对隐式等待进行封装 , 这样代码更加精简
同样的,采用装饰器对其他常用的函数进行封装,例如强制等待、点击、输入文本等 。
装饰器虽然很方便,但也会产生一些麻烦 。例如在find_element函数递归调用过程中,理应只要执行一次装饰器函数 。但因为装饰器已经装饰完毕,导致每次递归都会执行 。例如强制等待的sleep函数,如果递归次数越多等待时间越长 。
解除装饰器一般有两种做法:一是约定参数,当递归第二次调用时则不生效 。例如
这种方式实现简单,容易理解 。但是增加了参数限制,在fun函数中就不能使用first_sleep参数 。
二是采用装饰器采用wrapped实现,通过访问wrapped属性获得原始函数 。例如
但是某一个函数被多个装饰器装饰时,需要递归解除装饰器 。例如
最后整体代码如下
这次的封装其实还存在很多问题
1.find_element函数不仅仅只是提供查找元素功能 , 还提供一些其他功能,因此叫element_operation更为合适 。
2.find_element函数的参数过多,并且很多参数的使用并不在函数本身中,对代码阅读很不友好 。
3.得小心避免参数重复问题,假设装饰器sleep和装饰器wait_time都使用time这个参数,将无法区分具体是哪个函数使用 。
4.不利于扩展和维护 , 当功能过多时find_element的参数过于庞大 。
如果只是简单地封装和使用,上面这种方式也能达到较好的效果 。如果想进一步封装,建议采用链式调用方式,装饰器辅助封装 。例如
这样函数的扩展性和可阅读性有较大的提升
python 如何封装在某带参数函数之后等待时间?题主你好,
方法及相应代码见截图:
*.方法不只一种, 题主看看如果不合适请追问. 上面这种做法的好处是封装的这个函数func可以带任意多个位置参数.//就图主的问题来看, *args就够了, 如果func函数中还有关键字参数,则还需要使用**argv.
-----
希望可以帮到题主, 欢迎追问
python怎么读封装函数封装其实分为两个层面,但无论哪种层面的封装,都要对外界提供好访问你内部隐藏内容的接口(接口可以理解为入口,有python封装函数实例了这个入口 , 使用者无需且不能够直接访问到内部隐藏的细节,只能走接口,并且python封装函数实例我们可以在接口的实现上附加更多的处理逻辑,从而严格控制使用者的访问)
第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空间,python封装函数实例我们只能用类名.或者obj.的方式去访问里面的名字 , 这本身就是一种封装 。print(m1.brand) #实例化对象(m1.)
print(motor_vehicle.tag) #类名(motor_vehicle.)
-------------输出结果---------注意:对于这一层面的封装(隐藏),类名.和实例名.就是访问隐藏属性的接口
第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的) , 只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问 。
Python中私有化的方法也比较简单,即在准备私有化的属性(包括方法、数据)名字前面加两个下划线即可 。
将下面Python代码封装成函数Python:常用函数封装:
def is_chinese(uchar):
"""判断一个unicode是否是汉字"""
if uchar = u'一' and uchar=u'龥':
return True
else:
return False
def is_number(uchar):
"""判断一个unicode是否是数字"""
if uchar = u'0' and uchar=u'9':
return True
else:
return False
def is_alphabet(uchar):
"""判断一个unicode是否是英文字母"""
if (uchar = u'A' and uchar=u'Z') or (uchar = u'a' and uchar=u'z'):
return True
else:
return False
def is_other(uchar):
"""判断是否非汉字,数字和英文字符"""
if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
return True
else:
return False
def B2Q(uchar):
"""半角转全角"""
inside_code=ord(uchar)
if inside_code0x0020 or inside_code0x7e: #不是半角字符就返回原来的字符
return uchar
if inside_code==0x0020: #除了空格其他的全角半角的公式为:半角=全角-0xfee0
inside_code=0x3000
else:
inside_code =0xfee0
return unichr(inside_code)
def Q2B(uchar):
"""全角转半角"""
inside_code=ord(uchar)
if inside_code==0x3000:
inside_code=0x0020
else:
inside_code-=0xfee0
if inside_code0x0020 or inside_code0x7e: #转完之后不是半角字符返回原来的字符
return uchar
return unichr(inside_code)
def stringQ2B(ustring):
"""把字符串全角转半角"""
return "".join([Q2B(uchar) for uchar in ustring])
def uniform(ustring):
"""格式化字符串 , 完成全角转半角,大写转小写的工作"""
return stringQ2B(ustring).lower()
def string2List(ustring):
"""将ustring按照中文,字母,数字分开"""
retList=[]
utmp=[]
for uchar in ustring:
if is_other(uchar):
if len(utmp)==0:
continue
else:
retList.append("".join(utmp))
utmp=[]
else:
utmp.append(uchar)
if len(utmp)!=0:
retList.append("".join(utmp))
return retList
关于python封装函数实例和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读