一 异常
1 概念:异常是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
2 写法: try:….except
将可能出现的错误放在try里面,如果出现错误,代码会根据错误的类型,进入到指定except。这样做的好处是代码不会因为错误而中断执行
list = [1, 2, 3, 4, 5]
dic = {}
try:
print('--------') # 判断try是否执行
print(list[14])
print(dic['age'])
except IndexError as e:
print('捕获了一个索引错误{}'.format(e))
# 捕获了一个索引错误list index out of range
except KeyError as e:
print('捕获了一个关键字错误{}'.format(e))
当然,也可以简写为:
try:
print(list[21])
# Exception 和IndexError,KeyError 为父与子的关系
except Exception as e:
print('捕获了一个错误{}'.format(e))
# 输出:捕获了一个错误list index out of range
3 try.else还有finally 的用法:
try:
pass
except:
pass
else:
pass
finally:
pass
其中, 如果没有出现任何错误,即执行else模块 ,但是finally 这个绝对会执行的
4 手动抛出异常
age = input('请输出你的年龄')
age = int(age)
if age < 0:
print('年龄不对')
raise Exception('年龄不对,请务必输入一个大于0的数值')
二 函数
- 定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。写法如下:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于
- 函数的参数:
声明方法的时候,如果有参数,那么调用方法一定有参数。声明方法时候的参数叫做形参(形参为变量),调用方法时候的参数叫做实参(实参为给变量赋值)。
参数分为:必备参数,关键字参数,默认参数,不定长参数。
(1)必备参数:必须以正确的顺序传入函数,调用时的数量必须和声明时的一样
def fun1(name,age):
result = '我的名字是{}'.format(name,age)
return result
print(fun1('张三',18))
(2) 关键字参数
函数使用关键字参数来确定传入的参数值,使用关键字参数允许函数调用时参数的顺序与声明时不一样,因为python解释器能够用参数名来匹配参数值。
def fun1( name, age ):
"打印任何传入的字符串"
print ("Name: ", name)
print ("Age ", age)
return
fun1( age=50, name="miki" )
输出:
Name: miki
Age 50
(3)缺省参数
调用函数时,缺省函数得值如果没有被传入,则认为是默认值,注意一点,默认参数一定放在参数值的末尾,顺序不能乱。
def fun2( name, age = 35 ):
"打印任何传入的字符串"
print ("Name: ", name)
print ("Age ", age)
return
fun2( age=50, name="miki" )
fun2( name="miki" )
输出:
Name: miki
Age 50
Name: miki
Age 35
(4)不定长参数
有时候可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,用法如下
def fun(*args,**kwargs): 将多余的参数放到里面。
def fun1(a,b,*args):
print('a的值是{}'.format(a))
print('b的值是{}'.format(b))
print('args的值是{}'.format(args))
print('{} + {} = {}'.format(a,b,a+b))
fun1(10,15)
fun1(10,15,20,30)
输出:a的值是10
b的值是15
args的值是()
10 + 15 = 25
a的值是10
b的值是15
args的值是(20, 30)
10 + 15 = 25
下面是*args和**kwargs 传入参数的问题
def fun1(a, *args, **kwargs):
print('a的值是{}'.format(a))
print('args的值是{}'.format(args))
print('kwargs的值是{}'.format(kwargs))
fun1('你好')
fun1('nice', 'to', 'meet', 'you')
输出:
a的值是nice
args的值是('to', 'meet', 'you')
kwargs的值是{}
#name 和 age 不是关键参数
fun1('hello', name='张三', age=19)
输出:
a的值是hello
args的值是()
kwargs的值是{'name': '张三', 'age': 19}
fun1(20, [{'name': '张三'}])
输出:
a的值是20
args的值是([{'name': '张三'}],)
kwargs的值是{}
3 全局变量与局部变量
一个程序的所有变量都不是可以在任意位置访问的,访问权限取决于这个变量是在那里赋值的。
总体上讲,定义在函数内部的变量拥有一个局部作用域,而定义在函数外的,拥有全局作用域。局部变量只能在其定义的函数内部使用,而全局变量可以在函数任何位置使用。
name = '张三'
def fun1():
print(name)
name = '李四'
print(name)
# UnboundLocalError: local variable 'name' referenced before assignment
fun1()
name = '张三'
def fun1():
name = '李四' # 跟上面不一样的是先声明,再使用
print(name)
fun1()
注意上面使用时的细节。
name = '张三'
def fun1():
global name
print(name)
name = '李四'
print(name)
fun1()
输出:
张三
李四
4 return 语句 的作用是将方法内部的结果,让外面来使用。
5 函数的高级用法:
(1)匿名函数:
python 使用lambda 来创建匿名函数,lambda只是一个表示式,拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
用法:lambda [arg1 [,arg2,…..argn]]:expression
result = lambda x, y: x + y
print(result(5, 6))
输出:11
用法:
list1 = [1, 11, 56, 24, 99, 65, 46]
list2 = sorted(list1, key=lambda x: x) # x:表示遍历
print(list2)
输出:[1, 11, 24, 46, 56, 65]
list3 = [
{
'name': '张三',
'age': 16
},
{
'name': '李四',
'age': 17
},
{
'name': '王五',
'age': 13
}
]
list3 = sorted(list3, key=lambda x: x['age']) # x表示遍历x['age']
print(list3)
输出:[{'name': '王五', 'age': 13}, {'name': '张三', 'age': 16}, {'name': '李四', 'age': 17}]
list4 = sorted(list3, key=lambda x: x['age'], reverse=True)
print(list4)
输出:[{'name': '李四', 'age': 17}, {'name': '张三', 'age': 16}, {'name': '王五', 'age': 13}]
上面的key=lambda x:x[‘age’] 表示按照age的大小进行排序
list5 = [
{
'name': '张三',
'info': {
'age': 14,
'height': 165
}
},
{
'name': '李四',
'info': {
'age': 19,
'height': 168
}
},
{
'name': '王五',
'info': {
'age': 17,
'height': 173
}
}
]
list5 = sorted(list5, key=lambda x: x['info']['age'])
print(list5)
list6 = sorted(list5, key=lambda x: x['info']['height'])
print(list6)
6 eval(): 将括号里面的内容当成代码来执行
result = '12 / 3 * 4'
content = eval(result)
print(content)
输出:16.0
(慎用,确保安全)
7 map的用法
map 接受两个参数,第一个参数为函数,第二个参数是序列,map函数的意义就是将序列中的每一个值都在前面的函数中进行处理,并返回一个新的列表。
map 与lambda 求平方数:
result = list(map(lambda x: x**2, [1,2,3]))
print(result)
查找字典的关键字
def my_map(string):
all_number_list = {
'0': '零',
'1': '一',
'2': '二',
'3': '三',
'4': '四',
'5': '五'
}
return all_number_list[string]
# 这是一个字典,通过键寻找值的办法是dict['key'] 像上面这样
result = list(map(my_map, '54321'))
分别找出5,4,3,2,1对应的值
即分别把五,四,三,二,一放进my_map()函数中,依次进行处理,将得到的结果放在列表里。
print(result)
输出:['五', '四', '三', '二', '一']
8 reduce 的用法
reduce()函数接受的参数map()函数一样,不同的是reduce()函数对序列中的每一个元素反复调用函数,并返回一个最终结果
Python3中取消了reduce()内置函数,使用之前,得通过 from functools import reduce 来引用
def my_reduce(x, y):
return x + y
print(reduce(my_reduce, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
这里是1+2=3 ,再用3+3=6, 再用6+4=10,