Python: 函数参数传递机制

Python函数参数由实参传递给形参的过程,是由参数传递机制来控制的,根据实际参数类型不同,函数参数传递方式分为值传递引用传递(又称为地址传递)

值传递机制

所谓值传递,实际上就是将实际参数值的副本(复制品)传入函数,而参数本身不会受到任何影响。

值传递的实质:当系统开始执行函数时,系统对形参执行初始化,就是把实参变量的值赋给函数的形参变量,在函数中操作的并不是实际的实参变量。

引用传递

如果实际参数的数据类型是可变对象(列表、字典),则函数参数的传递方式将采用引用传递方式。

需要注意的是,引用传递方式的底层实现,采用的依然还是值传递的方式。

结论

  1. 不管什么类型的参数,在 Python 函数中对参数直接使用“=”符号赋值是没用的,直接使用“=”符号赋值并不能改变参数。
  2. 如果需要让函数修改某些数据,则可以通过把这些数据包装成列表、字典等可变对象,然后把列表、字典等可变对象作为参数传入函数,在函数中通过列表、字典的方法修改它们,这样才能改变这些数据。

标准数据类型

Python 定义了一些标准类型,用于存储各种类型的数据。

Python有五个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

Numbers(数字)

数字数据类型用于存储数值。

他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。

当你指定一个值时,Number 对象就会被创建。

可以使用del语句删除一些对象的引用。

del var1[,var2[,var3[....,varN]]]

通过使用del语句删除单个或多个对象的引用。

del var
del var_a, var_b

Python支持四种不同的数字类型:

  • int(有符号整型)
  • long(长整型[也可以代表八进制和十六进制])
  • float(浮点型)
  • complex(复数)

实例

int long float complex
10 51924361L 0.0 3.14j
100 -0x19323L 15.20 45.j
-786 0122L -21.9 9.322e-36j
080 0xDEFABCECBDAECBFBAEl 32.3e+18 .876j
-0490 535633629843L -90. -.6545+0J
-0x260 -052318172735L -32.54e100 3e+26J
0x69 -4721885298529L 70.2E-12 4.53e-7j
  • 长整型也可以使用小写 l,但是还是建议您使用大写 L,避免与数字 1 混淆。Python使用 L 来显示长整型。
  • Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。

注意:long 类型只存在于 Python2.X 版本中,在 2.2 以后的版本中,int 类型数据溢出后会自动转为long类型。在 Python3.X 版本中 long 类型被移除,使用 int 替代。

String(字符串)

字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 :

s = "a1a2···an"   # n>=0

它是编程语言中表示文本的数据类型。

python的字串列表有2种取值顺序:

  • 从左到右索引默认0开始的,最大范围是字符串长度少1;
  • 从右到左索引默认-1开始的,最大范围是字符串开头。

如果你要实现从字符串中获取一段子字符串的话,可以使用 [头下标:尾下标] 来截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

[头下标:尾下标] 获取的子字符串包含头下标的字符,但不包含尾下标的字符。

>>> s = 'abcdef'
>>> s[1:5]
'bcde'

当使用以冒号分隔的字符串,python 返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。

上面的结果包含了 s[1] 的值 b,而取到的最大范围不包括尾下标,就是 s[5] 的值 f。

加号(+)是字符串连接运算符,星号(*)是重复操作。

str = 'Hello World!'print str           # 输出完整字符串
print str[0]        # 输出字符串中的第一个字符
print str[2:5]      # 输出字符串中第三个至第六个之间的字符串
print str[2:]       # 输出从第三个字符开始的字符串
print str * 2       # 输出字符串两次
print str + "TEST"  # 输出连接的字符串
【结果】
Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST

List(列表)

List(列表) 是 Python 中使用最频繁的数据类型。

列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。

列表用 [ ] 标识,是 python 最通用的复合数据类型。

列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。

加号 + 是列表连接运算符,星号 * 是重复操作。如下实例:

list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']print list               # 输出完整列表
print list[0]            # 输出列表的第一个元素
print list[1:3]          # 输出第二个至第三个元素
print list[2:]           # 输出从第三个开始至列表末尾的所有元素
print tinylist * 2       # 输出列表两次
print list + tinylist    # 打印组合的列表
【结果】
['runoob', 786, 2.23, 'john', 70.2]
runoob
[786, 2.23]
[2.23, 'john', 70.2]
[123, 'john', 123, 'john']
['runoob', 786, 2.23, 'john', 70.2, 123, 'john']

函数将某个列表(比如这里的list)作为参数传入时,其传递的是list所在的真实地址,所有修改也是对list直接的修改。

当定义函数时,会设置函数中默认参数 list 的值,也就是列表 list=[];

在每次调用的时候如果传递了新的列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数(list=[]);

在调用中没有传递新的列表(使用默认列表 list=[] )的时候,程序会调用定义函数时保存的默认参数((list=[]));

列表在append的时候会在 list=[] 原来的基础上append追加值。

使用 list 作为函数参数时,参数为可变变量时,默认参数变量的内存地址是相同的。

Tuple(元组)

元组(Tuple)是另一个数据类型,类似于 List(列表)。

元组用 () 标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。

可以创建一个没有任何元素的元组 。 使用一对圆括号()创建一个空元组 。

# empty tuple creation`
tuple1 = () # printing tuple
print("tuple1: ", tuple1)
# printing length
print("len(tuple1): ", len(tuple1))
# printing type
print("type(tuple1): ", type(tuple1))

以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:

tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )
list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
tuple[2] = 1000    # 元组中是非法应用
list[2] = 1000     # 列表中是合法应用

元祖的特点

1、不支持添加元素【增】

2、不支持删除元素【删】

3、不支持修改元素(修改操作的步骤是:先删除、再添加)【改】

4、支持2种查找元素【查】

  • a、根据下标查找元素,常称为【访问】元素,时间复杂度为O(1)
  • b、根据元素获取下标,常称为【查找】元素,时间复杂度为O(n)

Dictionary(字典)

字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典用"{ }"标识。字典由索引(key)和它对应的值value组成。

dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"tinydict = {'name': 'runoob','code':6734, 'dept': 'sales'}print dict['one']          # 输出键为'one' 的值
print dict[2]              # 输出键为 2 的值
print tinydict             # 输出完整的字典
print tinydict.keys()      # 输出所有键
print tinydict.values()    # 输出所有值
【结果】
This is one
This is two
{'dept': 'sales', 'code': 6734, 'name': 'runoob'}
['dept', 'code', 'name']
['sales', 6734, 'runoob']

Python数据类型转换

函数 描述

int(x [,base])

将x转换为一个整数

long(x [,base] )

将x转换为一个长整数

float(x)

将x转换到一个浮点数

complex(real [,imag])

创建一个复数

str(x)

将对象 x 转换为字符串

repr(x)

将对象 x 转换为表达式字符串

eval(str)

用来计算在字符串中的有效Python表达式,并返回一个对象

tuple(s)

将序列 s 转换为一个元组

list(s)

将序列 s 转换为一个列表

set(s)

转换为可变集合

dict(d)

创建一个字典。d 必须是一个序列 (key,value)元组。

frozenset(s)

转换为不可变集合

chr(x)

将一个整数转换为一个字符

unichr(x)

将一个整数转换为Unicode字符

ord(x)

将一个字符转换为它的整数值

hex(x)

将一个整数转换为一个十六进制字符串

oct(x)

将一个整数转换为一个八进制字符串

判断tuple、list、dict是否为空

根据实验结果可知,直接通过:

if not xxx:

即可判断 tuple、list、dict 是否 为空 。

Python: 函数参数传递机制相关推荐

  1. python 函数参数传递机制_Python函数参数传递机制(超级详细)

    Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.通过学习<Python函数值传递和引用传递>一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引 ...

  2. (转载)Python函数参数传递机制(超级详细)

    Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.根据实际参数的类型不同,函数参数的传递方式分为值传递和引用传递(又称为地址传递),本节将对这两种传递机制做深度剖析. Pyth ...

  3. python函数参数传递机制_Python 学习笔记(一) 理解Python的函数传参机制

    对于刚接触Python不久的新手,Python的函数传参机制往往会让人迷惑.学过C的同学都知道函数参数可以传值或者传地址.比如下面这段代码 点击(此处)折叠或打开 void func(int inpu ...

  4. Python函数参数传递:传值还是传引用

    引子 首先来看一个列子: def change(val):val.append(100)val = ['T', 'Z', 'Y'] nums = [0, 1] change(nums) print(n ...

  5. Python函数参数传递

    Python函数参数传递 一.前言 二.了解形式参数和实际参数 1.通过作用理解 2.通过比喻来理解形参和实参 三.位置参数 1.数量必须与定义时一致 2.位置必须与定义时一致 四.关键字参数 五.为 ...

  6. Python函数参数传递的几种形式

    Python函数参数传递的几种形式 前言 位置传参 序列传参(单星号元组传参) 关键字传参 字典关键字传参(双星号字典传参) 混合传参 函数的缺省参数 结束 前言 莫听穿林打叶声,何妨吟啸且徐行.竹杖 ...

  7. python类带参数_Python函数参数传递机制(超级详细)

    Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.通过学习<Python函数值传递和引用传递>一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引 ...

  8. python 函数参数传递 格式_Python学习6.1_函数参数及参数传递

    大多数编程语言都绕不开一个名词,那就是--函数(function).而函数很重要的部分则是参数(arguments)的使用.Python的参数传递总体来说是根据位置,传递对应的参数.阐述如下: 1.位 ...

  9. Python 函数参数传递

    前言 Python 的函数参数传递相对于 C++来说更加灵活,并且使用也很方便,这里做下简单的总结. 正文 实参和形参 实参:在调用函数时提供的函数参数称为实参. 形参:定义函数时,函数中的变量成为形 ...

最新文章

  1. DEDE列表缩图中 给缩图添加alt锚文本信息的方法
  2. 前端技术周刊 2018-03-02
  3. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1124. 骑马修栅栏:欧拉路径、dfs
  4. Apache ZooKeeper - 集群中 Observer 的作用以及 与 Follow 的区别
  5. java中形参不可以是对象吗_(重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...
  6. 转载学习笔记:c++atoi
  7. 01-mysql数据库入门篇-认识mysql-01-05
  8. UVA1437 String painter
  9. oracle flex asm ceph,关于12c flex cluster及 flex asm疑问
  10. 以下程序运行后的输出结果是:int fun(int n){static int s=1;s*=n;return s;main(){int i,s=0;for(i=1;i<=4;i++){s+=f}}}
  11. python爬取谷歌学术_python爬取谷歌热度
  12. Android实现NFC芯片制造商识别
  13. 批量移动文件到以时间建立文件夹里
  14. buctoj-2022寒假集训2
  15. 云计算机服务层次,云计算包括哪几个层次的服务?
  16. java decvm_java – 如何使用-XX:UnlockDiagnosticVMOptions -XX:CompileCommand =打印选项与JVM HotSpot...
  17. SIMD——MMX指令的溢出处理
  18. 如何选择股票投资的行业和公司
  19. openlayers实现wfs属性查询和空间查询
  20. 什么是腾讯云Redis弹性缓存?

热门文章

  1. 5.2.1.开启驱动开发之路
  2. 签名别人的公钥以及验证签名的公钥
  3. hadoop 权限错误 Permission denied: user=root, access=WRITE, inode=/:hdfs:super
  4. Apache Thrift - 可伸缩的跨语言服务开发框架
  5. Lighttpd 搭建 Web 服务器
  6. Spring依赖处理过程源码分析
  7. 自定义View以及事件分发总结
  8. Android:文件读写.
  9. 论如何使用zabbix监控LNMP架构
  10. 11.2. simpara