首页 > 编程语言 >Python泛型函数与单分发器

Python泛型函数与单分发器

时间:2023-06-09 19:32:19浏览次数:43  
标签:分发 调用 函数 型函数 Python print arg fun verbose


这里的泛型函数是指由一组为不同类型参数执行相似操作的函数组成的函数,具体调用哪一个函数的实现取决于分发算法和参数类型。Python单分发器是实现泛型函数的一种形式,由一个单一参数来决定选择和调用哪个函数。下面的代码演示了单分发器泛型函数的有关用法:

from functools import singledispatch
@singledispatch
def fun(arg, verbose=False):
    '''如果没有合适的函数,就调用这个函数'''
    if verbose:
        print('Let me just say,', end=' ')
    print(arg)
#把register当做修饰器使用,为不同类型参数分别创建不同的实现
#使用下划线表示不关心函数的具体名字
@fun.register(int)
def _(arg, verbose=False):
    '''如果第一个参数的类型是int,就调用这个函数'''
    if verbose:
        print('Strength in numbers, eh?', end=' ')
    print(arg)
#也可以为函数起个名字
@fun.register(float)
def fun_num(arg, verbose=False):
    '''如果第一个参数的类型是float,就调用这个函数'''
    if verbose:
        print('Half of your number is:', end=' ')
    print(arg/2)
@fun.register(list)
@fun.register(tuple)
def _(arg, verbose=False):
    '''如果第一个参数的类型是list或tuple,就调用这个函数'''
    if verbose:
        print('Enumerate this:')
    for i, v in enumerate(arg):
        print(i, v)
#自定义类
class Scores:
    def __init__(self, *score):
        self.score = list(score)
#为自定义类型创建泛型函数
@fun.register(Scores)
def _(arg, verbose=False):
    if verbose:
        print('The scores are:')
    for sc in arg.score:
        print(sc, end=' ')
#如果第一个参数是None的类型,就调用这个函数
def doNothing(arg, verbose=False):
    print('Nothing to do.')
#可以把register()当做函数使用来注册指定类型
fun.register(type(None), doNothing)
#调用原始函数
fun('Hello world.')
#调用针对整型参数的函数
fun(666, True)
#调用针对实型参数的函数
fun(6.66)
#调用针对列表和元组参数的函数
fun(list(range(5, 10)))
fun(tuple(range(10, 15)))
#调用针对None类型参数的函数doNothing()
fun(None)
#调用原始函数
fun({1,2,3},True)
#调用针对自定义类型Scores参数的函数
fun(Scores(1, 2, 3, 4, 5))

标签:分发,调用,函数,型函数,Python,print,arg,fun,verbose
From: https://blog.51cto.com/u_9653244/6450804

相关文章

  • 列表元素循环移位中Python切片的妙用
    之前有个文章中介绍了列表循环移位的3中方法其中第二种方法虽然更直接地翻译了题目的要求,但是显得还是有点啰嗦,如果充分利用Python中的切片技术,可以写成下面更简洁的形式:>>>defdemo(lst,k):x=lst[k-1::-1]y=lst[:k-1:-1]returnlist(reversed(x+y))#测试用......
  • Python中的循环结构
    Python主要有for循环和while循环两种形式的循环结构,多个循环可以嵌套使用,并且还经常和选择结构嵌套使用。while循环一般用于循环次数难以提前确定的情况,当然也可以用于循环次数确定的情况;for循环一般用于循环次数可以提前确定的情况,尤其适用于枚举或遍历序列或迭代对象中元素的场合......
  • 使用Python批量随机化文件名
    本文的代码可以把指定文件夹中的所有文件名批量随机化。fromstringimportascii_lettersfromosimportlistdir,renamefromos.pathimportsplitext,joinfromrandomimportchoice,randintdefrandomFilename(directory):forfninlistdir(directory):#......
  • Python enumerate()函数的用法
    1.描述enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。 2.语法enumerate(sequence,[start=0]) 3.参数sequence: 一个序列、迭代器或其他支持迭代对象。start: 下标起始位......
  • Python响应Ctrl键+鼠标滚轮操作动态调整文本框的字号
    编写程序,使用tkinter设计程序界面,其中放置带滚动条的文本框组件ScrolledText,当鼠标悬于该组件上方时,可以通过Ctrl键和鼠标滚轮来动态调整文本框中文本的字号,鼠标滚轮向上滚动时增大字号,向下滚动时减小字号。参考代码:......
  • Python使用tkinter组件Label显示简单数学公式
    任务描述:使用Python+tkinter编写GUI程序界面,使用Label组件显示简单数学公式。参考代码:运行效果:......
  • 使用Python扩展库spleeter分离MP3音乐文件中的伴奏和人声
    spleeter是由法国的音乐流媒体公司Deezer开源的项目,可以把音乐文件其分成2、4、5等多个独立的音轨,支持mp3、wav、ogg等常见音频格式。Spleeter基于TensorFlow开发,依赖sniffio、six、oauthlib、rfc3986、requests-oauthlib、numpy、llvmlite、h11、anyio、wheel、tensorbo......
  • Python三种方法统计4位自然数变为黑洞数6174所需次数分布
    对于各位数字互不相同的4位自然数,其各位数字能够组成的最大数减去能够组成的最小数,对得到的差进行同样的操作,7次之内必然得到6174。详见:使用Python验证6174猜想编写程序,统计各位数字互不相同的所有4位自然数变为6174所需要的操作次数,分别统计所需次数一样的数字个数,最后绘制柱状图......
  • Python合并多幅静图为GIF动图
    给定多幅尺寸一样的静态图像文件,编写Python程序合并为GIF动图。准备工作:安装扩展库gif。打开一个PPT(144页幻灯片),另存为jpg图片,选择每张幻灯片一个图片文件。文件夹结构如下:参考代码:运行结果:......
  • Python获取每个用户使用的CPU和内存百分比
    任务描述:编写Python程序,查看当前系统中每个用户使用的CPU和内存百分比。准备工作:安装扩展库psutil。参考代码:连续几次运行结果:......