一 异常

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的数值')

二 函数

  1. 定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。写法如下:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于
  1. 函数的参数:
    声明方法的时候,如果有参数,那么调用方法一定有参数。声明方法时候的参数叫做形参(形参为变量),调用方法时候的参数叫做实参(实参为给变量赋值)。
    参数分为:必备参数,关键字参数,默认参数,不定长参数。
    (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,