灵活的参数

Python函数的形参种类多,且具有很高的灵活性。我们经常遇到:位置参数、关键词参数、仅限关键字参数、仅限位置参数等等。如果概念没彻底搞清楚,使用起来就不那么顺手。

提要:参数有 位置参数 和 关键字参数 两大类,分别都可以设置 默认值 ,也都可以设置 可变参数收集器 来分别收集两者。Python3新增了 仅限关键字参数 ,Python3.8新增了 仅限位置参数 。

上图概括了Python中的参数及其位置,这样在写程序的时候,我们能做到心中有数了。

本文以实际函数进化为例,逐个分析以上参数类型,最后囊括所有参数类型,以检验和加深理解。

现在,我们要编写一个HTML标签的生成函数。其调用形式:html = tag('p','Hello')

可得html内容为:<p>Hello</p>

仅使用位置参数就能实现这个功能。

位置参数

位置参数有普通位置参数、带默认值位置参数和可变参数收集器。如下用到前两者:

def tag(name,content='Nothing...'):template = '<%s>%s</%s>'%(name,content,name)return template

以上函数使用简单格式化字符串实现功能。其中name和content都是位置参数,实际调用的时候,可以灵活传入实参:

  • 忽略带默认值的参数 tag('p')

  • 顺序传入 tag('p','Hello')

  • 以命名方式乱序传入 tag(content='Hello',name='p')

  • 元组拆包传入参数 tag(*('p','Hello'))

  • 字典展开传入参数 tag(**{'name':'p','content':'Hello'})

可变参数收集

继续,我们需要根据多个内容,生成相同标签名的多个标签。例如html = tag('li','Line1','Line2','Line3')要得到html内容为:<li >Line1</li><li >Line2</li><li >Line3</li>

位置参数固定数目,而内容数目多变。为了实现收集多出来的'Line2'和'Line3',我们需要在位置参数列表的末尾,使用*args这种形式,定义可变参数收集,来收集剩余位置参数。所谓剩余元素,即实参传递给普通位置参数,覆盖默认值参数后的剩余参数。

def tag(name,content='Nothing...',*args):template = '<%s>%s</%s>'%(name,content,name)if args:for arg in args: template += '<%s>%s</%s>'%(name,arg,name)return template

可变参数*args,收集name和content之外的剩余位置参数。

关键字参数

HTML标签可能需要许多属性,比如<a alt='Test URL' href='www.X.com'>X website</a>中的alt和href属性。这些属性需要明确指明变量名和具体值,关键字参数非常合用。

在位置参数列表的最后,使用**kwargs来收集关键字参数。

def tag(name,content='Nothing...',*args,**kwargs):attrs = {}if kwargs:attrs.update(kwargs)attrs = ' '.join(['%s=\'%s\''%(k,v) for k,v in attrs.items()])template = '<%s %s>%s</%s>'%(name,attrs,content,name)if args:for arg in args: template += '<%s %s>%s</%s>'%(name,attrs,arg,name)return template

其调用形式为:html = tag('a','Hello',alt='test',href='http://www.baidu.com')',得html内容为:Hello`

仅限关键字参数

新的需求:HTML标签需要定义style、class属性。而且是强制要求定义,在生成函数调用时,必须指出这两个属性,否则报错。这样的强制关键字参数的要求,用仅限关键字参数(keyword-only),非常符合要求。

仅限关键字参数定义在位置参数列表的末尾,关键字参数收集器之前。可以有默认值。主要特性是强制要求调用者以关键字形式传入参数。

其调用形式header = tag('p','Welcome to my website.',class_='p1',style='font-size:30'),调用中,明确指出了仅限关键字参数class_和style。函数定义如下,其使用attrs字典整合了两个仅限关键字参数和关键字参数收集器的内容:

def tag(name,content='Nothing...',*args,class_,style='color:000000',**kwargs):attrs = {}attrs['class'] = class_ attrs['style'] = style if kwargs:attrs.update(kwargs)attrs = ' '.join(['%s=\'%s\''%(k,v) for k,v in attrs.items()])template = '<%s %s>%s</%s>'%(name,attrs,content,name)if args:for arg in args: template += '<%s %s>%s</%s>'%(name,attrs,arg,name)return template

仅限位置参数

tag标签生成HTML中的前两个参数:name表示标签名,content表示标签内容。我们不希望这个参数乱用,或者各种拆包、展开字典赋值。只希望它变成pow(2,3),divmod(14,3),这样意义非常明确的用法。以使调用tag时,明确第一个就是标签名,紧跟着标签内容。

实现这个功能,Python3.8新增的仅限位置参数(positional_only)非常适合。在仅限位置参数后加上一个/就实现了之前的参数是仅限位置参数的功能。

如下:

def
tag(name,content='Nothing...',/,*args,class_,style='color:
000000',**kwargs):

调用的时候,必须指出前两项,而且只能是按照位置传入,不能命名传入、元组拆包,字典展开等。这样的强制要求简化和规范了调用。

如下调用中,只有第一种符合仅限位置参数调用规范。

tag('p','content','content2',class_='flo')            #可行
tag(name='p',content = 'content','content2',class_='flo')
#失败

测试

使用如上述函数,我们实现了生成HTML标签内容的功能,整体测试如下:新建p,ul,li和a标签,封装进div,最后嵌入html中,生成index.html文件。

header = tag('p','Welcome to my website.',class_='p1',style='font-size:30')
intro = tag('p','gongqingkui M',class_='p1')li = tag('li','Python Intro.','DIY CPU',class_='li1')
ul1 = tag('ul','Projects',li,class_='ul1')homeURL = tag('a','X website',alt='Test URL',class_='a1',href='www.X.com',style='color:red')main = tag('div',header,intro,ul1,homeURL,class_='main')
html = tag('html',tag('head','',class_=''),tag('body',main,class_=''),class_='')with open('index.html','w',encoding='utf-8')as f:
f.write(html)

源代码戳:https://gist.github.com/gongqingkui/5e4d1d8967a5eb47a1caee4eee3fc617

总结

  • 参数有 位置参数 和 关键字参数 两大类

    分别都可以设置 默认值

    也都可以设置 可变参数收集器 来分别收集两者

  • Python3新增了 仅限关键字参数

  • Python3.8新增了 仅限位置参数

  • 参数形式总结如下,函数def fun(a,b=2,/,c,d=4,*args,e,f=6,**kwargs)中:

    a 仅限位置参数

    b 带默认值的仅限位置参数

    c 位置参数

    d 带默认值的位置参数

    *args 位置参数收集器

    e 仅限关键字参数

    f 带默认值的仅限关键字参数

    **kwargs 关键字参数收集器


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

【Python】大神教你五分钟搞清楚Python函数的参数!相关推荐

  1. python分布爬虫_大神教你13天搞定Python分布爬虫(3)

    03. 爬取数据-urllib库 1. 小试牛刀 怎样扒网页呢? 其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HT ...

  2. linux手机刷机包制作工具_大神教你五分钟制作安卓ROM包 ROM包修改教程

    之前很多人在网上问:"如何自己制作安卓ROM包?"今天,刷机帮的小编就给大家分享一篇关于安卓ROM包制作以及修改的实用教程,感兴趣的朋友可以一起来看看,当然,老司机就直接略过. 制 ...

  3. python网络编程自学_五分钟搞定Python网络编程实现TCP和UDP连接

    Python网络编程实现TCP和UDP连接, 使用socket模块, 所有代码在python3下测试通过. 实现TCP#!/usr/bin/env python3 # -*- coding: utf- ...

  4. python大神-python大神教你在最短时间内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  5. python读取matlab数据_两分钟搞定Python读取matlab的.mat数据

    Matlab是学术界非常受欢迎的科学计算平台,matlab提供强大的数据计算以及仿真功能.在Matlab中数据集通常保存为.mat格式.那么如果我们想要在Python中加载.mat数据应该怎么办呢?所 ...

  6. 启程 - 《每日五分钟搞定大数据》

    <每日五分钟搞定大数据>原创系列,每周不定期更新.欢迎关注公众号:大叔据   想了很久,准备开始写一系列的文章,记录这些年来的所得所想,感觉内容比较多不知从哪里开始,画了个思维导图确定了大 ...

  7. python大神-Python 大神 kennethreitz 又搞事了

    原标题:Python 大神 kennethreitz 又搞事了 Python 程序员,特别是做爬虫的同学都知道 HTTP 请求库 Requests,Requests 完美体现了 "for H ...

  8. mc服务器出生地修改,《我的世界》MC出生地太坑爹怎么办?大神教你一个指令就搞定了!...

    <我的世界>MC出生地太坑爹怎么办?大神教你一个指令就搞定了!在沙盒游戏<我的世界>里面,玩家们刚开始进入游戏的地方就是出生地,又叫做出生点.这些出生地是系统随机安排生成的地方 ...

  9. 大神教你如何剪辑热播剧《你是我的荣耀》,3分钟精彩片段变现!【覃小龙课堂】

    嗨,您好,我是您的老朋友:覃小龙,您可以叫我覃总.今天为您带来的干货如下: 大神教你如何剪辑热播剧<你是我的荣耀>,3分钟精彩片段变现![覃小龙课堂] <你是我的荣耀>现在是排 ...

最新文章

  1. 当面试官问这些基础的Python问题时,竟然还有80%的人不会!
  2. mysql 开发基础系列18 存储过程和函数(下)
  3. linux驱动入口函数执行了,probe函数没有执行排查
  4. STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。
  5. 原生js写三级联动 java_原生js三级联动的简单实现代码
  6. c++17(30)-文件读写(1)
  7. 形态学图像处理学习笔记
  8. att汇编教程 linux,ATT 汇编语法
  9. 天正双击墙体不能编辑_天正CAD绘图必须要知道的技巧
  10. Kali学习 | 权限提升:5.3 社工SET_启动
  11. 软件测试基础知识总结
  12. 关于csdn 博客图片无法加载的问题!
  13. 数论概论 第三章 勾股数组与单位圆
  14. Android微信小尾巴,微信朋友圈小尾巴app
  15. 什么是物理机(独立服务器)?物理机和虚拟主机有什么区别?
  16. 【Python网络编程和并发-多线程共享数据混乱引出同步锁】
  17. android中LitePal的使用
  18. 机器学习经典算法总结之线性回归
  19. Not Shading
  20. 影院卖品既然除了爆米花都卖不动,为什么不降价?

热门文章

  1. RPM包管理命令rpm
  2. 整型的赋值超出该类型的取值范围
  3. redo log重做日志缓冲
  4. EDP项目结构规范心得
  5. Win7启动Oracle出错
  6. 通过100个单词掌握英语语法(十六) come
  7. vue使用sweetalert2弹窗插件
  8. 01-sql优化及索引
  9. 一起玩树莓派3+使用Gitlab搭建专业Git服务
  10. php ci框架中载入css和js文件失败的原因及解决方法