错误和异常;函数

错误和异常

错误

python的语法分析器完成,检测到错误所在的文件和行号。以向上箭头标记错误位置。最后显示错误类型

,当程序检测到一个错误,解释器就无法继续执行下去,抛出异常,终止程序

语法错误(syntax error)

for i in range(2)
    print(i)

SyntaxError: invalid syntax

逻辑错误(logic error)

执行期间错误(runtime error)

异常

系统根据不同的错误,抛出不同异常。

常见异常

异常描述
NameError尝试访问一个没有申明的变量
ZeroDivisionError除数为 0
SyntaxError语法错误
IndexError索引超出序列范围
KeyError请求一个不存在的字典关键字
FileNotFoundError文件未发现错误(比如你要读的文件不存在)
AttributeError尝试访问未知的对象属性
ModuleNotFoundError模块未发现
IndentationError缩进

异常处理

程序一旦发生错误,程序就无法继续运行

为了使程序健壮,可做相关异常处理

try…except…

try:
    try_statements
except [exceptionType] [as identifier]]:
    except_statements
[else:
    else_statements]
[finally:
    finally_statements]
  • try子句
    • try … except 必须放在可能发生异常的程序段周围,而try_statements则是可能发生异常的程序段。
  • except子句
    • 用来捕捉指定的异常,一旦捕捉到,就执行与之对应的except_statements,即用来处理异常的程序语句。
    • 如果要针对不同的异常做不同的处理,可以使用多个except子句,其中,exceptionType是欲捕捉的异常类型,省略不写,表示为预设类型:BaseException,所有异常都继承自该类别。
    • [as identifier]可以将捕捉到的异常指向一个变量,然后,通过该变量获得异常相关的信息。
    • 不带任何异常类型使用except,将捕获所有发生的异常。不推荐这么使用,因为我们不能通过该程序识别出具体的异常信息。
  • else子句
    • 当try_statements没有异常发生时,会跳过except子句,执行else_statements。
    • 该子句为可选语句,可以指定或者省略。
  • finally子句
    • 当要离开try … except 时(无论异常是否发生),就会执行finally_statements,可以使清除错误或者收尾的语句。可给可忽略。

demo:

try:
    x=1
    y=0
    z=x/y
except (ZeroDivisionError,NameError) as e:
    print(e.args)  #args会检测错误类型
else:
    print('没有错误')

(‘division by zero’,)

raise(触发异常)

除了系统抛出的异常,我们可以用raise语句自己触发异常

格式:

raise [Exception[args[traceback]]]

Exception:异常类型

args:我们自己提供的异常参数

traceback:可选,如果存在,跟踪异常对象

try:
    raise ZeroDivisionError('sorry,error occurs')
except NameError:
    print('捕捉到错误')

报错

assert(断言)

assert condition

逻辑上相当于:

if not condition:

​ raise AssertionError()

为断言添加一个异常参数()

assert exception[args]

try:
    a=2
    assert a==1,'a不等于1'     #如果a不等于1则抛出‘a不等于1’
except NameError:
    print('名字错误')

函数

built-in function 内置函数

说明如下:

​ 1.函数代码块以 def 关键词开头,后接函数标识符名称和小括号 ()。

​ 2.任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

​ 3.函数的第一行语句可以选择性地使用文档字符串----用于存放函数说明。

​ 4.函数内容以冒号起始,并且缩进。

​ 5.return [表达式] 结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回 None。

其中参数列表和返回值不是必须的,return后也可以不跟返回值,甚至连 return也没有。

对于return后没有返回值的和没有return语句的函数都会返回None值

有些函数可能既不需要传递参数,也没有返回值。

没有参数时,包含参数的圆括号也必须写上,圆括号后也必须有“:”。

def sum(x,y):
    '求和'
    return x+y

print(sum.__doc__)   #返回函数的说明

求和

函数参数种类

形参和实参

形参

只有在调用时才分配内存单元。调用结束后,即释放所分配的内存单元。因此,形参只在

内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量。

实参

实参是一个确定的值,能够传递给形参

作为未知参数或者关键字传递

def people(name,age):
    print('姓名:',name)
    print('年龄:',age)

people('DJ','20')

输出:
姓名: DJ
年龄: 20

只传递实参,位置一 一对应---->位置参数

使用位置参数时和函数头定义的形参在顺序、个数、类型相对应

关键字参数

def people(name,age,job='IT',hobby='trip'):
    print('姓名:',name)
    print('年龄:',age)
    print('工作:',job)
    print('爱好:',hobby)
people('DJ','20',hobby='paly',job='student')

输出:
姓名: DJ
年龄: 20
工作: student
爱好: paly

默认值参数,关键字参数,必须放在位置参数后

不定参数

主要指 *args 和 **kwargs 两个魔法变量,主要用于函数定义,我们可以将不定数量的参数传递给一个函数

*args 用来接收任意非键值对类型,放在位置参数后面,返回元组

def function(para,*args):
    print('位置参数:',para)
    print('不定参数:',args)
    print(type(args))

function(1,2,3,4,[1,2])

输出:
位置参数: 1
不定参数: (2, 3, 4, [1, 2])
<class 'tuple'>

kwargs用来接收任意不定长度的键值对,返回字典

def function(**kwargs):
    print(kwargs)

function(a=1,b=2)

输出:
{'a': 1, 'b': 2}

函数引用

def foo():
    print('in foo()')
    bar()
def bar():
    print('in bar()')
foo()

输出:
in foo()
in bar()       #调用可以不管先后顺序,

函数属性

内嵌函数

作用域

bar()整个函数都处于外部foo()函数的作用域里(foo()是我们可以从外部访问的一个对象区域)。

除了在foo()内部,

def foo():
    def bar():
        print('bar called')
    print('foo called')
    bar()

bar()

输出:
NameError: name 'bar' is not defined

作用域的产生

只有当变量在module,Class,函数中定义的时候,才会有作用域的概念。

def function():
    a='foo'
    print(a)
print(a)

输出:
NameError: name 'a' is not defined

在作用域中定义的变量,一般只在作用域内有效。需要注意的是,在if-elif-else,for-else,while-else,try-except(else-finally)等关键字的语句中不会产生作用域

作用域的类型

使用一个变量时并不要求需要预先声明它,但在真正使用的时候,它必须绑定到某个内存对象(被定义,赋值)。

这种变量名的绑定将在当前作用域引入新的变量,同时,屏蔽外层作用域中的同名变量

局部作用域(locale—L)

嵌套作用域(enclosing—E)

​ E也包含在def关键字中,E和L是相对的,E相对于跟上层的函数而言也是L。与L的区别在于,对于一个函数而言,L是定义在此函数内部的局部作用域

主要为了实现闭包而增加的实现

全局作用域(Global—G)

即在模块层次中定义的变量。模块顶层声明的变量具有全局作用域。从外部来看,模块的全局变量就是一个模块对象的属性。

内置作用域(built-in—B)

系统固定模块中定义的变量

搜索变量名的优先级:局部>嵌套>全局>内置

全局变量和局部变量

a=6
def foo():
    print(a)
    a=66
foo()

输出:
报错(内部和外部a重名,会优先搜索内部a,但是print在定义a之前所以报错)
a=6
def foo():
    print(a)
foo()

输出:
6
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值