Python学习札记(十二) Function3 函数参数一
参考:函数参数
Note
1.Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
2.Python的函数支持默认参数。
eg.
#!/usr/bin/env python3
def power(x, n=2) :
i = 1
a = 1
while i <= n :
a = a * x
i = i + 1
return a
output:
>>> from function2 import power
>>> power(3)
9
>>> power(3, 3)
27
>>> power(3, 4)
81
>>> power(3, 1)
3
注意:
<1>.一是必选参数在前,默认参数在后,否则Python的解释器会报错。
比如,如果power函数这样子定义:
def power(x = 3, n)
那么这样调用函数时:power(2) 解释器无法判断传入的参数2是赋值给x还是n:若赋值给x,那么应该报参数数目不匹配的错误;若赋值给n,那么就应该计算3的平方。
<2>.当函数有多个参数时,应该把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
eg.
def my_function(name, age,
prof = 'Student', city = 'FuZhou') :
print(name, age, prof, city)
return
output:
>>> from function2 import my_function
>>> my_function('Chen', 20)
Chen 20 Student FuZhou
>>>
默认参数降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。
3.可以不按顺序提供部分默认参数。
如,my_function函数定义时提供四个形参:name, age, prof, city。此时,我想传入三个参数,分别是名字、年龄、城市,职业使用默认参数,做法是:
my_function('Li', 20, city='Beijing')
输出:
>>> my_function('Li', 20, city='Beijing')
Li 20 Student Beijing
当无序提供默认参数时,需要指定提供默认参数的名字。
4.对于默认参数,最需要注意的地方在于,默认参数必须指向不变对象!
如:
def function3(L=[]) :
L.append('EOF')
return
function3函数指定了一个默认参数L,默认为空的list。
正常调用时,结果正确:
>>> from function2 import function3
>>> function3([1, 2, 3])
[1, 2, 3, 'EOF']
>>> function3([1, 2, 3, 'Hi'])
[1, 2, 3, 'Hi', 'EOF']
>>>
倘若我不传入任何参数进行调用:
>>> function3()
['EOF']
>>> function3()
['EOF', 'EOF']
>>> function3()
['EOF', 'EOF', 'EOF']
>>> function3()
['EOF', 'EOF', 'EOF', 'EOF']
>>>
每次调用期望得到的都是['EOF'],但是上面调用结果显示的却是不断往L中加入'EOF'。
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数都改变了L指向对象的内容,下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。
我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。
4.Python支持可变参数。即我们调用函数时传入的参数是可变的。
在函数定义时,必须确定参数个数,如果要做到传入参数可变,则需要使用list。
def function4(number) :
res = 0
for i in number :
res += i*i
print(res)
return
函数function4用于计算aa+bb+...+n*n。
在调用时,我们必须将参数封装为list:
>>> from function2 import function4
>>> function4([1, 2, 3])
14
>>>
在Python中,我们可以使用类似C语言指针的形式指定形参,将传入的不定数目的参数封装为一个tuple。
def function4(*number) :
res = 0
for i in number :
res += i*i
print(res)
return
调用时就无需对传入的参数进行封装了:
>>> from function2 import function4
>>> function4(1, 2, 3)
14
如果传入的参数是一个list的话,此时会报错:
>>> function4([1, 2, 3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/wasdns/Desktop/PythonLearn/function2.py", line 31, in function4
res += i*i
TypeError: can't multiply sequence by non-int of type 'list'
在调用时,我们可以在list的名字前面加上一个*,以多个参数的形式传入参数。
>>> function4(*[1, 2, 3])
14
>>> lista = [1, 2, 3]
>>> function4(*lista)
14
2017/1/30
Python学习札记(十二) Function3 函数参数一的更多相关文章
- Python学习日记(十二) 匿名函数
匿名函数: 未解决一些简单的需求而设计的函数 语法: func = lambda x : x**2 func:函数名 lambda:类似def的关键字 x:参数 x**2:返回值表达式 适用内置函数: ...
- python学习笔记十——模块与函数
第五章 模块与函数 5.1 python程序的结构 函数+类->模块 模块+模块->包 函数+类+模块+包=Python pyth ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- python学习第二十五天函数位置参数和关键词参数
函数位置参数顾名思义就是按位置排序,按位置对应参数,位置一一对应,函数的关键词参数是不按照顺序来的,可以指定的参数传值.但是注意的是,位置参数必须在关键词参数之前. 1,函数位置参数 def good ...
- Python 学习 第十二篇:pandas
pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,最常用的数据结构是:序列Series和数据框DataFrame,Series类似于numpy中的一维数组,类似于关 ...
- python学习笔记(十 二)、操作数据库
每一种语言都少不了多数据库进行各种操作. python支持多种数据库.有关python支持的数据库清单,请参阅:https://wiki.python.org/moin/DatabaseInterfa ...
- Python学习(十二) —— 面向对象
一.初识面向对象 面向过程的核心是过程,流水线思维,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写程序的复杂度,只需要顺着要执行的 ...
- Python学习札记(十) Function1 函数调用
参考:调用函数 Note 1.Python内置了很多函数,我们可以直接对这些函数进行调用.Python官网:Built in Fuctions eg.调用abs函数(取绝对值函数): >> ...
- python学习(十二)模块
怎么一下子就来学了模块? 其实学了判断.循环.函数等知识就可以开始下水写程序了,不用在意其他的细节,等你用到的时候再回过头去看,此所谓囫囵吞枣学习法. 为啥学模块? 有点用的.或者有点规模的程序都是要 ...
随机推荐
- oracle 归档空间满的解决办法
问题现象: 通过命令提示符登陆数据库,一般提示“ora-03113:通信通道的文件结尾”错误,查看trace日志,可以看到详细信息.部分摘录如下(橙色部分给出了建议方案): Errors in fil ...
- MapReduce小文件优化与分区
一.小文件优化 1.Mapper类 package com.css.combine; import java.io.IOException; import org.apache.hadoop.io.I ...
- 【MFC系列】MFC快速设置控件文本字体、大小、颜色、背景
以静态文本为例,分享一下怎么修改文本字体.大小.颜色.背景等参数.其他文本.控件等可参照修改. 1.修改字体.大小 这个很简单,首先在Dlg类中声明一个CFont类型的成员变量: 然后在类的初始化函数 ...
- db-mysql-001- 语句备份表
1.备份表 CREATE TABLE AAbak( SELECT * FROM AA ); 2.两个已存在表导数据 INSERT INTO AAbak(c1,c2) SELECT c1,c2 FROM ...
- RocketMQ Java 客户端实现
本章介绍使用 Java 实现RocketMQ 的客户端. 以及各种消息的方式的实现. 本章实现了以下几种消息的实现方式: 一:普通消息 普通的消息分为三种: 1> 可靠的同步消息 可靠的同步传输 ...
- CXF框架介绍及Spring集成
1.CXF框架概念介绍 Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP.POST/HTTP.H ...
- oracle RMAN复制数据库
列出创建副本数据库的目的 • 选择用于复制数据库的方法 • 使用RMAN 复制数据库 • 使用RMAN 备份复制数据库 • 基于正在运行的实例复制数据库 使用副本数据库 • 使用副本数据库可执行以 ...
- 美化MFC 之调整静态文本的颜色 字体。 用于添加公司标题 联系方式 口号等数据
很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调, 因此很多人往往找到很多其它的控件对对话框进行美化修饰, 例如给静态控件设置字体,设置背景颜色等等, 其实这些完全可以由VC自 ...
- SCP命令只能单项拷贝,另一个方向“RSA host key for 172.16.103.176 has changed and you have requested strict checki Host key verification failed. lost connection”问题
[dinghuaneng@95 move_data]$ scp * dinghuaneng@172.16.103.176:/home/dinghuaneng@@@@@@@@@@@@@@@@@@@@@@ ...
- 什么是Socket?简单点,通俗易懂的?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...