上节课已经简单的跟大家讲了如何定义一个方法,但是并没有深入去讲,这一节我们继续来学习定义方法中需要注意的几点

默认参数

前面我们讲到定义一个方法时是可以传递参数的,除了这个功能,实际上python在定义方法时还可以自己预先定义一些参数,这些参数一般被称为默认参数(Default Argument Value)

参数赋值

比如下面一个官方的例子

def ask_ok(prompt, retries=4, reminder="Please try again"):
...: while True:
...: ok = input(prompt)
...: if ok in ('y', 'ye', 'yes'):
...: return True
...: if ok in ('n', 'no', 'nop', 'nope'):
...: return False
...: retries = retries - 1
...: if retries < 0:
...: raise ValueError("invalid user response")
...: print(reminder)

首先在定义方法的时候传了三个参数

其中retriesremider都传了默认的参数

下面通过几种形式调用这个方法

传递一个参数

ask_ok('Do you really want to quit?')

 因为只传递了一个参数,而这个参数的形式参数就是prompt,另外两个参数因为已经有了默认的值,所以这时候程序并不会报错

传递两个参数

ask_ok('OK to overwrite the file?', 2)

 第二次调用我们传了两个参数,这时解释器会自动根据参数的顺序来赋实参,第一个传给没有默认值的prompt,第二个按照顺序赋值给了第二个形式参数,也就是retries,最后一个形式参数因为有默认值所以不会包错

传递所有参数

ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

 这个相信不用解释了吧,按照顺序传递实参

变量赋初值

除了在定义方法时给参数赋准确的值以外,你还可以指定一个变量,作为 参数的值

例如以下代码

In [6]: i = 6

In [7]: def func(arg=i):
...: print(arg)
...: In [8]: i = 7 In [9]: func()
6

  

在开始的时候定义一个变量i,然后直接在方法中指定参数为i,最后修改了i的值,最终输出的修改后的i的值

可变类型作为参数

在这里要注意一下,当你定义方法时传的是一个可变的参数时,例如列表、字典时,会有一点不同

例如以下代码

In [10]: def func(a, L=[]):
...: L.append(a)
...: return L
...: In [11]: print(func(1))
[1] In [12]: print(func(2))
[1, 2] In [13]: print(func(3))
[1, 2, 3]

  

参数的值并不会被初始话(也就是消除),会有一个内存区域专门存放这一部分的值

如果你不想保留存在的值

这时你就可以使用以下方法来解决这个问题

In [14]: def func(a, L=None):
...: if L is None:
...: L = []
...: L.append(a)
...: return L

  

关键字参数(Keyword argument)

关键字参数,也可以看作是一个键值对应的参数类型,也就是前面讲的字典类型

你可以通过关键字参数传递很多需要的信息

同时你也可以在后面调用方法时对它进行更改

例如下面一行代码,定义一个方法

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")

  

在传递参数时需要注意以下几点

parrot(1000) # 按照位置传递实参
parrot(voltage=1000) # 按照参数名传递参数
parrot(voltage=1000000, action='VOOOOOM') # 按照参数名传递参数
parrot(action='VOOOOOM', voltage=1000000) # 按照参数名传递参数
parrot('a million', 'bereft of life', 'jump') # 按照位置传递参数
parrot('a thousand', state='pushing up the daisies') # 一个位置参数,一个参数名称

  

但需要注意以下几点

  1. 没有赋初值的参数,不能直接略过
  2. 在传递覆盖默认值参数时,一定要记得加上关键字
  3. 不能重复传递参数
  4. 不能传递定义方法中没有的关键字参数

有时候,你可能并不知道穿进来的参数有多少个,这时你就可以把多出来的参数,存为一个列表,或是一个字典,这个是经常用的

比如我们下面定义一个方法

In [15]: def cheeseshop(kind, *args, **kwargs):
...: print("-- Do you have any", kind, "?")
...: print("--I'm sorry, we're all out of", kind)
...: for arg in args:
...: print(arg)
...: print("-"*40)
...: for kw in kwargs:
...: print(kw, ":", kwargs[kw])
...: In [16]: cheeseshop("Limburger", "It's very runny, sir.", "It's really very, VERY runny, sir.", shopkeeper="Michael Pal
...: in", client="John Cleese", sketch="Cheese Shop Sketch")
-- Do you have any Limburger ?
--I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch

  

注意列表参数是*开头的,字典参数是**开头的

苏十三博客网站 www.susmote.com

10_Python函数方法加深_Python编程之路的更多相关文章

  1. 09_Python定义方法_Python编程之路

    有关Python判断与循环的内容我们上几节已经跟大家一起学习了,这一节我们主要针对def 做一个讲解 def 定义一个方法 在项目编程中,我们往往要做很多重复的事,比如一个排序的功能(当然Python ...

  2. 12_Python的(匿名函数)Lambda表达式_Python编程之路

    Python作为一门高级语言,与很多编程语言一样都具有匿名函数这一特征 匿名函数,也就Lambda表达式,通俗来讲就是不用命名的方法,直接定义,直接用即可 创建匿名函数需要用到Lambda关键字,下面 ...

  3. 01-Python的介绍_Python编程之路

    首先用一句业内非常出名的话来介绍Python "人生哭短,我用Python" 这也是Python宣传时经常说的一句话 从这句话中,可以非常清楚Python他到底优点在哪里,为什么要 ...

  4. 03-第一个脚本程序以及输入输出_Python编程之路

    上节课已经教大家安装了Python的解释器,那么这节课我们就可以正式来写代码了 说明:在下面的代码演示中,我将大部分使用python交互器演示代码的输入输出,注意">>>& ...

  5. 04_Python的数据类型1数值和字符串_Python编程之路

    上一节我们通过一个helloworld程序学习python的一些简单操作,还有输入与输出 这节我们来讲Python的数据类型与变量的操作 Python的交互器 在讲这个之前,我要先讲一下python的 ...

  6. 07_Python的控制判断循环语句1(if判断,for循环...)_Python编程之路

    Python的数据类型在前几节我们都简单的一一介绍了,接下来我们就要讲到Python的控制判断循环语句 在现实编程中,我们往往要利用计算机帮我们做大量重复计算的工作,在这样的情况下,需要机器能对某个条 ...

  7. 15_Python模块化编程_Python编程之路

    之前跟大家讲的是一些python的数据基础,从这篇文章开始,我们开始正式学习python的模块化编程 下面我们解释一下什么叫做模块 之前已经讲过怎么去定义一个方法,如果你是用python交互器(自带交 ...

  8. 06_Python的数据类型3元组,集合和字典_Python编程之路

    上一节跟大家讲了Python的列表,当然不是完整的讲完,后续我们还会提到,这一节我们还是来讲Python的数据类型 首先要讲到的就是元组 元组其实拥有列表的一些特性,可以存储不同类型的值,但在某些方面 ...

  9. 11_Python的列表推导式_Python编程之路

    上一节我们结束了有关python的方法相关内容 这一节我们先来学习python的列表推导式 之前跟大家说过range方法的使用,在这里我就不做过多的解释了,如忘记了,请翻阅之前的介绍 列表推导式,是P ...

随机推荐

  1. 常见的链表排序(Java版)

    上篇博客中讲解了九大内部排序算法,部分算法还提供了代码实现,但是那些代码实现都是基于数组进行排序的,本篇博客就以链表排序实现几种常见的排序算法,以飨读者. 快速排序的链表实现 算法思想:对于一个链表, ...

  2. Leaflet客户端学习笔记

    Leaflet介绍 Leaflet 是一个为建设交互性好适用于移动设备地图,而开发的现代的.开源的 JavaScript 库.代码仅有 33 KB,但它具有开发在线地图的大部分功能.支持插件扩展, L ...

  3. python全栈学习--day9(函数初始)

    Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...

  4. Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

    在配置好hive后启动报错信息如下: [walloce@bigdata-study- hive--cdh5.3.6]$ bin/hive Logging initialized using confi ...

  5. hibernate框架学习笔记12:查询优化

    类级别查询优化: 创建一个实体类: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public clas ...

  6. beta冲刺1

    前言:这篇算是开始补之前的开端,毕竟beta阶段我们从前面开始就有在陆续做了. 今天的工作: 接收了新成员*1,然后几个人聚了一下,并且讨论了一下目前遇到的问题,以及目前需要处理的问题. 目前遇到的问 ...

  7. 201621123031 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 答 ...

  8. 20145237《Java程序设计》第一周学习总结

    教材学习内容总结 java可分为Java SE.Java EE.Java ME三大平台. java SE分为JVM.JRE.JDK.与java语言四个部分. JRE包括java SE API和JVM. ...

  9. iOS开发所有KeyboardType与图片对应展示

    1.UIKeyboardTypeAlphabet 2.UIKeyboardTypeASCIICapable 3.UIKeyboardTypeDecimalPad  4.UIKeyboardTypeDe ...

  10. C简单实现双向链表

    <pre name="code" class="cpp">//链表结构 typedef struct DulNode { DataType data ...