Py学习  »  Python

《python定义函数知识大讲堂<2>》

爬虫俱乐部 • 5 年前 • 444 次点击  

暑期Stata培训班招生啦!!!接力线上的网课培训,我们在今夏又开始新一轮的线下培训啦!8月4日至12日,爬虫俱乐部期待与您的相遇!培训具体内容详见推文《暑期Stata编程技术定制培训班》。

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

好消息:爬虫俱乐部隆重推出数据定制及处理业务啦,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部资深高级会员为您排忧解难!



上个星期的推文《python定义函数知识大讲堂<1>》简单的向大家介绍了在python中定义函数return语句的基础用法,今天将着重介绍定义函数时的各种参数,参数包含了我们想要传递给函数的信息,定义函数的时候,只要把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,调用者无需了解函数内部的结构。

首先我们需要区分形参和实参的区别。在上篇推文最开始我们定义了一个函数greet,其中username就是形参,而值“ChrisWu”则是实参:

def greet(username):
   print("Hello~"+username.title()+"!")
greet("ChrisWu")

函数定义中有多少种形参,那么在函数调用中就有多少种实参,向函数传递实参的方式主要有以下几种:

1.位置参数/必备参数;

2.缺省参数/默认参数;

3.关键字参数;

4.可变参数/不定长参数

在正文开始前,笔者有几句话要说:可能读者在看文字描述各类参数时会有些许的迷惑,笔者在刚开始学习的时候也总是拘泥于晦涩的文字,但实际上只要结合例子再自己动手操作一遍,就能很好的理解各类参数的含义~还请各位往下看~

一、位置参数

位置参数(又称必备参数)须以正确的顺序传入函数,调用时的数量必须和声明时的一样,函数调用时每一个实参都关联到函数定义中的一个参数,下面我们通过一个例子来更好的理解位置参数:




    
def index(m,n):
   s = 1
   while n>0:
       n = n-1
       s = s*m
   return s
index(5,3)
index(3,5)

结果如图:

在这里我们定义了函数index,用来计算任意数的n次方,参数m和n都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数m和n。比如计算53次方,必须是index(5,3)而不是index(3,5)。

二、默认参数

在上例中,如果我们的代码是:

index(5)

那么将会有如下的运行错误提示:

程序截图显示我们调用函数时遗漏了一个位置参数n,这个时候默认参数(也称为缺省参数)就派上用场了,由于日常计算平方项的次数比较多,我们可以把第二个位置参数n的默认值设置为2,具体程序如下:

def index(m,n=2):
   s = 1
   while n>0:
       n = n-1
       s = s*m
   return s  
index(5)

结果如图:

在定义函数时,我们在第二个位置参数后面加了个=2,这表示n的默认值为2,那么我们在调用函数时,即使只输入一个参数也不会报错,它默认表示的是计算n=2即m的平方项的值。默认参数简化了函数的调用,在这里需要注意的是,定义函数时,默认参数要放在位置参数的后面。

三、关键字参数

       关键字参数是传递给函数的名称-值对,它允许我们传入0个任意个包含参数名的参数,它直接将参数中形参的名称和实参的值关联起来了,因此允许函数调用时参数的顺序与定义时不一致,下面的例子将帮助我们理解关键字参数:

def info(name,age):
   print("\nMy name is " + name.title())
   print("I'm " + age.title() + " years old")
info(name = 'Chenshuo',age = '25')
info(age = '25',name = 'Chenshuo')

结果如图:


当然你可以使用位置参数的方式直接来调用函数,结果也是一样的:

info('chenshuo','25')

以上只是关键字参数的基础用法,前面曾经提到过关键字参数允许我们传入任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个字典,请看下例:

def info(name,age,**kw):
    print("\nMy name is " + name.title())
    print("I'm " + age.title() + " years old")
    print(kw)
info("Chenshuo","25")
info("Chenshuo","25",city="Hefei",sex="male")

       定义函数时在参数kw前加上两个**,表示kw为关键字参数,这样一来我们不仅可以只传入位置参数,还可以传入任意个数的关键字参数,结果如图:

可以看到传入的关键字参数是以字典的形式作为结果展示的,关键字参数最大的功能就是扩展了函数的功能,在上面定义的函数info中,我们不仅可以得到关于名字和年龄的基础信息,还允许函数的调用者传递更多的其他的信息。

       我们还可以限制接受哪些特定的关键字参数,这叫做命名关键字参数,程序如下:

def info(name,age,*,city,sex):
   print(name,age,city,sex)
info("Chenshuo","25",city="Hefei",sex="male")

和关键字参数前加**不同,命名关键字参数使用的是*,*后面的参数被视为命名关键字参数。结果如图:

如果你试图传入非命名关键字参数,调用时则会报错:

四、可变参数

有时我们可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做可变参数或者叫不定长参数,顾名思义,可变参数就是传入的参数个数是可变的,可以是任意个,包括0个。和上述3种参数不同,声明时不会命名。

我们以这样一个数学题目为例,我们要计算……的值,在这里传入的参数个数是不确定的,那么如何定义函数来实现这个计算呢,程序如下:

def square(*nums):
   sum = 0
   for i in nums:
       sum = sum + i*i
   return sum
square(1,2,3)

在函数名称nums前加*即可用来表示可变参数,由于传入的可变参数的个数是不确定的,在函数内部接收到的是由参数组成的元祖,所以在函数定义时,用for循环来遍历元祖中的每一个参数进行计算。结果如图:


注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~


                                   




             文字编辑:赵宇亮

  技术总编:刘贝贝

往期推文推荐:

1.爬虫俱乐部新版块--和我们一起学习Python

2.hello,MySQL--Stata连接MySQL数据库

3.hello,MySQL--odbcload读取MySQL数据

4.再爬俱乐部网站,推文目录大放送!

5.用Stata生成二维码—我的心思你来扫

6.Mata中的数据导出至Excel

7.谈谈图形中坐标设置的技巧

8.如何输出某个关键词在字符串中的所有位置?

9.想看什么书?Stata君帮你寻!——爬取中南财大图书馆书目信息

10.爬虫俱乐部隆重推出网上直播课程第一季




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/TiaES2X77o
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/20707
 
444 次点击