Python学习笔记三

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

一、函数的定义

Python中定义一个函数需要使用def语句,依次确定函数名、参数及函数体内容:

 

#一个求绝对值的函数
def my_abs(x):if x>0:return xelse:return -x

 

如果函数体内没有return语句,也会返回None。return None可以简写为return。

如果要定义一个什么都不做的函数(空函数),可以用pass语句,pass也可以用在if语句中:

def nop():pass
def nopx(n):if n>0:passelse:return

*返回多个值的函数

#给出长方形的长和宽,输出面积和周长
def sqcount(l,w):area=l*wlength=2*(l+w)return area,length

可以增加一些语句看看这个返回的到底是什么:

x,y=sqcount(3,4)
print(x,y)
#这里输出12,14
r=sqcount(5,6)
print(r)
#这里输出(30,22)

从上述代码可以看出,虽然看起来函数返回了多个值,其实本质还是返回了一个值,只是这个值的类型是元组!

二、函数的参数

(一)位置参数

前面定义的my_abs()以及sqcount()中的参数都是位置参数,它是调用函数时必须传入的参数,并且按照定义时的位置顺序传递给对应参数。

(二)默认参数

有一些情况,参数中有部分参数在多数情况下都是某一个值,这时候可以在定义函数的时候将其固定设置下来,在调用时候如果该参数值和定义时对应的参数值相同则可以不写出,在不相同时候则需要写出具体值代入函数。

#默认情况下,国籍设置为china
def person_info(name,age,country='china'):print('name=',name,'age=',age,'country=',country)return True
#ZhangHua国籍为china则可以不传入国籍参数
person_info('ZhangHua',26)
#Tom国籍为美国,则需要设置
person_info('Tom',29,'America')

需要注意的是,当有多个默认参数时,在调用的时候可以按照顺序提供默认参数,也可以加上参数名以指定默认参数之间的对应关系。

def enroll(name, gender, age=6, city='Beijing'):print('name:', name)print('gender:', gender)print('age:', age)print('city:', city)
#年龄信息参数的传入是按照定义时候的第三的顺序
#所以可以不加参数名
enroll('Bob', 'M', 7)
#这里年龄使用了定义时的默认值,所以不写出
#但需要设置城市,而位置关系又和定义时候不一致
#所以需要写上'city='
enroll('Adam', 'M', city='Tianjin')

关于默认参数还必须注意一点,如:

#定义时候使用了默认参数L,指向一个空列表
def testa(L=[]):L.append('END')return Lprint(testa())
#输出['END']print(testa())
#输出['END',‘END']

两次同样的调用,为什么输出不一样呢?在定义的时候默认参数L的值就被计算了,即指向[],L也是一个变量,在每次调用时如果改变了L的内容(指向),默认参数自然就随之而变了。所以:默认参数必须指向不可变对象!

可以通过None修改上面的代码:

def testa(L=None):if L is None:L=[]L.append('END')return L

(三)可变参数

可变参数是指传入的参数数量是可以变化的,任意个的。设计这种参数的情况就是在函数定义的时候不知道调用时会有多少个参数,比如:列表、元组等等。那么就可以将参数整体设置为一个列表或者元组等等,而Python对于变量是不需要指定类型的,所以简单的做法如下:

def calc(numbers):sum=0for i in numbers:sum=sum+ireturn sum

但上述这种定义的方法必须传递类型为可迭代类型的数据,如列表等,如传递其他类型比如数值类型的会报TypeError: 'int' object is not iterable的错误。

#正常运行,输出6
x=[1,2,3]
print(calc(x))
#报错:参数非迭代类型
y=2
print(calc(y))

对于上面定义的函数,也可以直接传入值:

print(calc([1,2,3]))print(calc((2,3,5,7,11))

这样在使用的时候其实并不够方便,因为需要先组装成一个列表或元组才可以使用,如果想用如下的方式调用可必须用到可变参数的方法:

cal(1,3,5,7,9,11)

可以在定义时把参数变为可变参数:在参数前面加’*':

def calc(*numbers):sum=0for i in numbers:sum=sum+ireturn sum

这样就可以直接通过cal(1,3,5,7,9,11)调用,而如果是一个列表或元组的话,在传参时只需要在列表或元组名前加'*'作为参数也可以方便调用:

print(calc(1,3,5,7,9,11))x=[1,2,3]
print(calc(*x))y=(2,3,5,7)
print(calc(*y))

不管参数在传递前是什么类型,是直接的数值传递还是列表或元组,但传入函数后,函数内部都是将这些可变参数组装成一个元组来操作。

(四)关键字参数

 

关键字参数允许传入任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个字典(dict):

#前两个参数为位置参数,代表姓名和年龄信息
#第三个参数则定义了可选的关键字参数,可以让调用者提供其他信息
def person(name,age,**kw):print(name,'-',age,'-',kw)

#调用者可以只提供必选的位置参数信息
#输出:LiNa - 32 - {}
person('LiNa',32)
#调用者提供一个信息:国家
#输出: Jenny - 35 - {'country': 'British'}
person('Jenny',35,country='British')
#调用者提供两个信息:国家和性别
#输出:Tom - 39 - {'gender': 'M', 'country': 'Holland'}
person('Tom',39,gender='M',country="Holland")

如果已有一个dict,那可以直接在字典名前加'**',将其作为关键字参数传递:

#输出:LiNa - 32 - {'coutry': 'China', 'gender': 'F', 'food': 'Reganmian'}
lina_info={'coutry':'China','gender':'F','food':'Reganmian'}
person('LiNa',32,**lina_info)

(五)命名关键字参数

在关键字参数中,调用者可以自行设置传递到关键字参数的参数名,如上述的country,gender和food都是可选并且可自行设置的,如果要限制关键字参数的名字,就需要用到命名关键字参数:

#关键字参数只接受名字为city和job
def person(name,age,*,city,job):print(name,'-',age,'-',city,'-',job)
#这里将会报错,因为没有传递job参数
person('mengfei',50,city='Nanjing')    
#正常运行,输出:wanggang - 60 - Beijing - Actor
person('wanggang',60,city='Beijing',job='Actor')

命名关键字参数可以有默认值,这样的话在调用时候该参数可以不显式指定:

def person(name,age,*,city='Beijing',job):print(name,'-',age,'-',city,'-',job)
#输出:wanggang - 60 - Beijing - Actor
person('wanggang',60,job='Actor')

当函数参数列表中有可变参数时,后面跟着的命名关键字参数就不再需要一个特殊符号'*'了:

def person(name, age, *args, city, job):print(name, age, args, city, job)
#a,b为位置参数是必选的
#c是可选的默认参数
#args是可选的可变参数
#kw是可选的关键字参数
def f1(a,b,c=0,*args,**kw):print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
#函数调用时,解释器自动按照参数位置和参数名进行传递#只有两个位置参数,默认c为0
#输出:a= 1 b= 2 c= 0 args= () kw= {}
f1(1,2)#位置参数加自定义的默认参数值
#输出:a= 1 b= 2 c= 3 args= () kw= {}
f1(1,2,c=3)#位置参数+默认参数+可变参数
#如果有关键字参数则需要加命名
#输出:a= 1 b= 2 c= 3 args= ('a', 'b') kw= {}
f1(1,2,3,'a','b')#输出:a= 1 b= 2 c= 3 args= ('a', 'b') kw= {'x': 99}
f1(1,2,3,'a','b',x=99)

 

转载于:https://www.cnblogs.com/tsembrace/p/8456089.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle中如何分页,Oracle中操作分页

mysql中分页的写法:select t.* from tbl_user t order by t.id limit $offset , $perpage$currentPage 1;//当前页码其中后面$sql:with partdata as (select rownum rowno,t.* from tablename t where column1090order by column) select * from partda…

Flask爱家租房--发布新房源(保存房屋图片)

0.页面展示效果 1)首先房东填写房屋信息; 2)当房东填写发布的房源信息之后,隐藏(hide)刚才填写信息的界面,同时显示(show)上传房屋图片的界面。 1.后端代码 api.route("/houses/image&q…

数字的处理 :小数点四舍五入

js取float型小数点后两位数的方法 转载 发布时间:2014年01月18日 17:03:32 投稿:shangke 我要评论 js中取小数点后两位方法最常用的就是四舍五入函数了,前面我介绍过js中四舍五入一此常用函数,这里正好用上,下面…

如何成为一名优秀的C程序员

问题的提出 每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇博文里列出一些有关C语言的最佳读物应该能帮到不少人。如果你知道其它的优秀…

CFS调度器

一、前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了。这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭。我有一个循序渐进的方法,那就是先不要看最新的内核&#…

oracle索引分类与区分,深入理解Oracle表(6):堆组织表(HOT)和索引组织表(IOT)的区别...

摘要:堆表:又称堆组织表,常用的表类型,以堆的方式管理,当增加数据时,将使用段中第一个适合数据大小的空闲空间。当删除数据时,留下的空间允许以后的DML操作重用。 堆组织表(heap table)应用中99…

Flask爱家租房--发布新房源(总结)

重点总结 学习过程中,发现house_id贯穿两个接口内容,现对后端逻辑部分做以下总结: 1)房东首先在前端填写房屋的基本信息,此时通过newhouse.js文件$("#form-house-info").submit(function (e) {…}进行处理&…

关系的三类完整性约束

规则2.1实体完整性规则(Entity Integrity)若属性A是基本关系R的主属性,则属性A不能取空值空值就是“不知道”或“不存在”或“无意义”的值例: 选修(学号,课程号,成绩) “学号、课…

[QNAP crontab 定時執行程式

注意要自動執行的 sh 檔不要放在 /root 裡, 不然韌體更新後檔案會不見, 要放在個人帳號的資料夾,例如 /share/homes/帳號/ QNAP 的 crontab 放在 /etc/config/crontabvi /etc/config/crontab 例如要每日5:00執行 backup.sh 的話,加上這行 00 5 * * * /s…

调整标志位方法oracle,面试题(二)(示例代码)

1.查找/us/oc al/nginx/ogs下更改时间在7天前以log 后极的文件井移动到sr/oca/nginx/log/backup下(至少两种方法)2. Centos 查看某个进程的环境安量3.简述DNS迭代查询和递归直询的区别4.简述TCP三次握手过程以及涉及到的状态(可画草图) ?5.统计TCP连接状态(至少两种方法)6.发现…

国际最具潜力IT专业认证

正如很多的争论一样,IT认证也是现在争论的热点,在IT专业人士的世界里,IT认证对于其职业规划有着很大的影响。在时下究竟哪个认证才具有最大意义呢?本文罗列了十个最具潜力的技术认证,一起来看看都有哪些吧!…

关系代数

关系代数是一种抽象的查询语言,它用对关系的运算来表达查询关系代数运算对象是关系运算结果亦为关系关系代数的运算符有两类:集合运算符和专门的关系运算符

设计模式的六大原则

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更加容易被他人理解、保证代码可靠性。设计模式是代码编制真正工程化(工程化即系统化、模块化、规范化的一个过程。指将具有一定规模数量的单个…

作业7

stuNum 201709090072 print(年级是:stuNum[0:4]) print(专业编号是: stuNum[4:9]) print(序号是: stuNum[-3:]) stuNum 440982201812111876 print(所在省市:stuNum[0:2]) print(所在地区:stuNum[2:4]) print(所在县区:stuNum[4:…

linux进程退出没有log,Linux下应用进程消失原因分析-Go语言中文社区

应用部署在Linux环境下,如果出现未知原因导致应用进程被杀(应用日志中没有任何异常现象,日志出现中断现象),如果对于进程消失原因没有特别明确的方向,可以考虑从系统日志(/var/log/messages)方面查找原因。 命令参考egrep -i kill…

数学是成就卓越开发人员的必备技能

编者按:原文作者Alan Skorkin是一名软件开发人员,他在博客中分享对软件开发相关的心得,其中有很多优秀的文章,本文就是其中一篇,作者认为:成为优秀的开发人员,可以没有数学技能,但成…

Flask爱家租房--celery(总结)

0. celery整体逻辑图 个人理解为:此处的客户端client与以往定义的客户端(前端)并不一样,角色相当于以往的后端逻辑处理代码,即发布任务的一方,只是相当于处理者worker而言是客户端。 1.准备工作&#xff1…

linux端口514启动,Linux查看端口使用状态及启动(示例代码)

Netstat -tln 命令是Linux查看端口使用情况/etc/init.d/vsftp start 是用来启动ftp端口~!看文件/etc/servicesnetstatLinux查看端口查看已经连接的服务端口(ESTABLISHED)netstat -aLinux查看端口查看所有的服务端口(LISTEN,ESTABLISHED)sudo netstat -ap…