程序员

数据分析学习笔记—python函数、异常与处理

作者:admin 2021-06-10 我要评论

文章目录 一、python函数异常与处理思维导图 二、补充说明python函数参数如有错误还请指正 1、python函数参数的传递机制 2、python函数参数分类位置、默认值、关...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

一、python函数异常与处理思维导图

在这里插入图片描述

二、补充说明:python函数参数(如有错误,还请指正)

1、python函数参数的传递机制

说到python函数参数的传递机制,就很容易想起C++中令人头秃的值传递、引用传递和指针传递。如果你想弄清这个概念,然后去查了不同的人的博客说明,或者去知乎搜索,可能会看到不亚于php是世界上最好的语言大战的一场混战,这可能导致你和我一样,纠结这个概念一天,然后头昏脑涨(当然,可能是我想太多,毕竟之前微机原理内存什么的学的不是很好,下意识对指针这种东西产生了恐惧,导致对python函数的传递机制也产生理论误解)。

有人说python函数参数的传递机制是引用传递,有人说python函数参数的传递机制是值传递,当然,也有人提到是赋值传递。我查询了python的官方文档,找到了这么两段话:

The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus,
arguments are passed using call by value (where the value is always an object reference, not the value of the object). [1] When a function calls another function, or calls itself recursively, a new local symbol table is created for that call.
[1] Actually, call by object reference would be a better description, since if a mutable object is passed, the caller will see any changes the callee makes to it (items inserted into a list).
简单翻译就是: 函数调用的实际参数(参数)在被调用时被引入到被调用函数的本地符号表中。因此,参数是通过按值调用(其中值始终是对象的引用,而不是对象的值)传递的。
[1]当一个函数调用另一个函数或递归调用自身时,将为该调用创建一个新的本地符号表
Remember that arguments are passed by assignment in Python. Since assignment just creates references to objects, there’s no alias between an argument name in the caller and callee, and so no call-by-reference per se.
请记住在 Python 中参数是通过赋值来传递的。 由于赋值只是创建了对象的引用,因此在调用者和被调用者的参数名称之间没有别名,所以本身是没有按引用调用的。

这里提到了,python函数参数的传递并不能简单的称之为值传递或者引用传递。
印象中的值传递,是将实参的值进行复制,将复制后的值传过去,随便你怎么造作,我原来的值都在那里,不会变化。
而引用传递,则是给实参取了个小名,对小名如何操作,都还是嚯嚯大名,始终是一个东西,进行操作改变,形参变了,则实参也变了。
这里我写了三个小代码片段
第一段代码中x初始值为1,函数内部对z进行+1操作,然后输出x

x=1
print("x为%d"%x)
print(id(x))
def test (z):
    z=z+1
    print("z为%d"%z)
    print(id(z))
test(x)
print("x为%d"%x)
print(id(x))
x为1
140708681847616
z为2
140708681847648
x为1
140708681847616

第二段代码段中x为一个列表,对列表加一个元素4,输出结果

x=[1,2,3]
print(x)
print(id(x))
def test (z):
    z=z+[4]
test(x)
print(x)
print(id(x))
[1, 2, 3] 
2002223753416 
[1, 2, 3] 
2002223753416

第三段代码中x仍然是一个列表,对列表x使用append操作,输出x

x=[1,2,3]
print(x)
print(id(x))
def test (z):
    z=z.append(4)
test(x)
print(x)
print(id(x))
[1, 2, 3]
2002217153672
[1, 2, 3, 4]
2002217153672

从这三段代码段的运行结果可以看出,python既不是值传递也不是引用传递,因为如果是值传递,那么所有代码的运行结果应当与最开始一样,不会受形参的影响。如果是引用传递,那么函数调用时,应当函数内部的操作会影响到实参。但事实是并没有,在代码的运行中,我加入了id(),可以查看运行前后内存地址的变化。
具体如何理解python函数参数的传递机制,以这段代码为例:

x=1
print(id(x))  #140708681847616
def test (z):
    z=z+1
    print(id(z))  #140708681847648
test(x)
print(id(x))  #140708681847616

最开始x=1,其内存地址为140708681847616,x可以视为绑定了对象int 1的一个名字,即可以用x去引用1
在这里插入图片描述
函数调用时,z=x,此时z也是对象int 1的一个名字,这两个名字指向的都是Int 1,如果没有意外,那么他们将继续这样保持下去,但是
在这里插入图片描述
函数调用后,z=z+1,如果是单纯的引用传递,那么z的值会变成2并且输出

但是实际上,z+1是一个新的对象,然后他们绑定了z

z的内存地址很明显变为了140708681847648,也就是说,现在z引用的是z+1,即2,而不再是1了
在这里插入图片描述

所以,最后输出,x仍然为1的原因是因为x仍然引用的是1,并没有发生改变,至于上文中list.append后,输出的值发生改变,是因为它并没有产生新的对象,不需要重新绑定原列表中的某个名字,也就不会发生改变。

2、python函数参数分类(位置、默认值、关键字)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210410231142139.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NqYXZhXw==,size_16,color_FFFFFF,t_70在这里插入图片描述
位置参数: 按位置传递参数

def ask(name, str,city):
    print(name+str+city)
ask('张三','来自','北京')  #张三来自北京

默认值参数: 为一些改动不大的参数指定默认值,调用函数时,可以使用更少的参数,更方便。需要注意,默认值只计算一次。默认值为列表、字典或类实例等可变对象时,后续的调用会在第一次调用的结果上进行。不想在后续调用之间共享默认值时,需要指定例如列表类L=None。

def ask(name, str='来自',city='安徽'):
    print(name+str+city)

只给出必选实参name:

ask('张三') #输出结果:张三来自安徽

给出一个可选实参name和str:

ask('张三','离开') #张三离开安徽

给出全部实参:

ask('张三','离开','安庆')  #张三离开安庆

关键字参数:调用函数时使用key=value的方式去指定参数的传递

def ask(name, str='来自',city='安徽'):
    print(name+str+city)
ask('张三',city='北京',str='离开')  #张三离开北京

可变参数: 不确定传递多少个参数,也就是参数数量未知时,可以用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。
1、包裹位置传递:根据传进参数的位置合并为一个元组进行传递

def test(*args):  #元组类型
    ....
func(a, b, c)

当需要传递的是列表或者元组时,可以在列表或者元组前面加上*作为一个整体进行传递。
2、包裹关键字传递

def func(**kargs): #字典类型
	  ....
	func(a=1, b=2, c=3)

命名关键字参数: 限制参数传入的名字,例:

 def person(name, age, *, city, job),中间加入*作为分隔符,后面的参数全部限制输入时的参数名,即为命名关键字参数
 或者
 def person(name, age, *args, city,job)  
 如果对命名关键字参数赋默认值,则实参可以不用写该参数

混合参数:位置参数、默认参数、可变参数(包裹位置参数、包裹关键字参数)、命名关键字参数、关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

三、补充说明:python函数的异常捕获

常见错误类型和继承关系

BaseException (所有异常基类)
±- SystemExit (解释器请求退出)
±- KeyboardInterrupt (用户中断执行)
±-GeneratorExit (生成器发生异常来通知退出)
±- Exception (常规错误的基类)
±- StopIteration (迭代器没有更多的值)
±- StopAsyncIteration ()
±- ArithmeticError (所有数值计算错误的基类)
| ±- FloatingPointError (浮点计算错误)
| ±- OverflowError (数值计算超出最大限制)
| ±- ZeroDivisionError (除(或取模)0)
±- AssertionError (断言语句失败)
±- AttributeError (对象没有这个属性)
±- BufferError ()
±- EOFError (没有内建输入,到达EOF标记)
±- ImportError (导入模块/对象失败)
| ±- ModuleNotFoundError ()
±- LookupError (无效数据查询的基类)
| ±- IndexError (序列中没有此索引)
| ±- KeyError (映射中没有这个键)
±- MemoryError (内存溢出错误)
±- NameError (未声明/初始化对象)(没有属性)
| ±- UnboundLocalError (访问未初始化的本地变量)
±- OSError 操作系统错误
| ±- BlockingIOError
| ±- ChildProcessError
| ±- ConnectionError
| | ±- BrokenPipeError
| | ±- ConnectionAbortedError
| | ±- ConnectionRefusedError
| | ±- ConnectionResetError
| ±- FileExistsError
| ±- FileNotFoundError
| ±- InterruptedError
| ±- IsADirectoryError
| ±- NotADirectoryError
| ±- PermissionError
| ±- ProcessLookupError
| ±- TimeoutError
±- ReferenceError 弱引用试图访问已经垃圾回收了的对象
±- RuntimeError 一般的运行时错误
| ±- NotImplementedError 尚未实现的方法
| ±- RecursionError
±- SyntaxError 语法错误
| ±- IndentationError 缩进错误
| ±- TabError Tab和空格混用
±- SystemError 一般的解释器系统错误
±- TypeError 对类型无效的操作
±- ValueError 传入无效的参数
| ±- UnicodeError Unicode相关错误
| ±- UnicodeDecodeError Unicode解码错误
| ±- UnicodeEncodeError Unicode编码错误
| ±- UnicodeTranslateError Unicode转换错误
±- Warning 警告的基类
±- DeprecationWarning 关于被弃用的特征的警告
±- PendingDeprecationWarning 关于特性将会被废弃的警告
±- RuntimeWarning 可疑的运行时行为警告
±- SyntaxWarning 可疑的语法的警告
±- UserWarning 用户代码生成的警告
±- FutureWarning 关于构造将来语义会有改变的警告
±- ImportWarning
±- UnicodeWarning
±- BytesWarning
±- ResourceWarning

;原文链接:https://blog.csdn.net/cjava_/article/details/115559534

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 数据分析学习笔记—python函数、异常与

    数据分析学习笔记—python函数、异常与

  • 使用Selenium实现微博爬虫:预登录、展

    使用Selenium实现微博爬虫:预登录、展

  • Python练习题三(2021.04.10)

    Python练习题三(2021.04.10)

  • 自动化如何为企业提供有形价值

    自动化如何为企业提供有形价值

腾讯云代理商
海外云服务器