异常、日志、推导

运行时异常:
try:
  有可能发生异常的代码:1/0
except 异常类型:
  捕获并处理语句
except 异常类型:
 处理语句

try:
 语句体
except (异常类型1,异常类型2):
 处理语句
except Exception:
 所有异常

try:
 语句体
except 异常类型 as 名称:
 print(名称)

try:
 语句体
except 异常类型 as 名称:
 print(名称)
else:
 没有异常才会执行的代码
在python2中,捕获所有异常的写法:
try:
except:
最终要执行的内容写在finally中:
try:
except:
else:
finally:
练习:
定义一个方法:方法体如下,在此方法体内不进行异常处理
定义一个列表list1,通过下标访问最后一个元素,list1[len(list1)]




定义一个调用的方法:捕获异常
异常可以嵌套
自定义异常类:一般继承Exception
class sexException(Exception):
    pass
def dosex():
 sex=input("请输入性别:")
    if sex!='男' and sex!='女':
        raise sexException("性别只能为男或女")
try:
 dosex()
except sexException as se:
    print(se)




异常类型关系
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
日志:




推导:

'''推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:


1.列表推导式
2.字典推导式
3.集合推导式'''
#1到10的平方的列表
#一、列表推导式


#例1:整除3的数字列表
numbers = []
for x in range(100):
    if x % 3 == 0:
   numbers.append(x)
# 使用推导实现
numbers = [x for x in range(100) if x % 3 == 0]
#例2:
def squared(x):
    return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print(multiples)
#例3:使用()生成 generator将列表推导式的[]改成()即可得到生成器。--yeild
multiples = (i for i in range(30) if i % 3 is 0)
print(type(multiples))
#二、字典推导式
#字典推导和列表推导的使用方法是类似的,只不过中括号该改成大括号。直接举例说明:
#例1:快速更换key和value
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)
#三、集合推导式
#它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
#例一:
squared = {x**2 for x in [1, 1, 2]}
print(squared)
# Output: set([1, 4])
#例1: 用集合推导 字符串长度的集合
strings = ['a','is','with','if','file','exception']
{len(s) for s in strings} #有长度相同的{}会只留一个 []多个,这在实际上也非常有用
# Output: set([1, 2, 4, 9])
#练习 0到9 的次方
squares = []
for x in range(10):
 squares.append(x**2)
#使用推导实现
squares = [x**2 for x in range(10)]


#1.将单词长度大于3的转为大写输出
names = ['bob','tom','alice','jerry','wendy','smith']
print([name.upper() for name in names if len(name)>3])
#2.求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]
#3.求m中3,6,9组成的列表
m = [[1,2,3],[4,5,6],[7,8,9]]
[row[2] for row in m]
#或
[m[row][2] for row in (0,1,2)]
#4: 求m 中斜线1,5,9组成的列表
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[m[i][i] for i in range(len(m))]
#5.求m,n中矩阵各个元素的乘积
m = [[1,2,3],[4,5,6],[7,8,9]]
n = [[2,2,2],[3,3,3],[4,4,4]]
[m[row][col]*n[row][col] for row in range(3) for col in range(3)]
[[m[row][col]*n[row][col] for col in range(3)] for row in range(3)]
[[m[row][col]*n[row][col] for row in range(3)] for col in range(3)]
#6.结合两个列表的元素,如果元素之间不相等的话
combs = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
 combs.append((x, y))
#推导
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
#7.create a list of 2-tuples like (number, square)
[(x, x**2) for x in range(6)]
















将csv文件读取为字典列表


我们常常需要读取和处理csv文件的数据。处理csv数据的一个最有用的方法就是把它转换为一个字典列表。


Python


import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
 data.append(x)
1
2
3
4
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
 data.append(x)
你可以使用列表生成式快速实现:


Python


import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
1
2
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
DictReader类将会自动地使用csv文件的第一行作为字典的key属性名。DictReader类返回一个将会遍历csv文件所有行的对象。这个文件对象通过open()函数产生。我们提供了open()两个参数–第一个是csv文件名,第二个是模式。在这例子,‘rU’有两个意思。想往常一样,‘r’表示以读模式打开文件。‘U’表明我们将会接受通用换行符–‘n’,‘r’和‘rn’。




-------------------------------------------------------------------
匿名函数




python 使用 lambda 表达式来创建匿名函数
lambda只是一个表达式,函数体比def简单很多
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率




lambda函数的语法只包含一个语句: lambda [arg1 [,arg2,.....argn]]:expression 




使用如下:




1 square = lambda x : x**2
2 print(square(3)) # 9

4 sum = lambda x, y : x + y
5 print(sum(2, 3)) # 5
例:
#例:1个参数
func1 = lambda x:x*2
print(func1(3)) #结果为6
#例:多个参数(可以初始化参数)
func2 = lambda x,y,z=1: x+y+z
print(func2(2,3)) #结果为6
print(func2(2,3,4)) #结果为9




func=lambda x:x+1
print(func(1))
#2
print(func(2))
#3
#以上lambda等同于以下函数
def func(x):
 return(x+1)




可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体。在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。




  Python中,也有几个定义好的全局函数方便使用的,filter, map, reduce。




from functools import reduce 
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]




print (list(filter(lambda x: x % 3 == 0, foo)))
#[18, 9, 24, 12, 27]




print (list(map(lambda x: x * 2 + 10, foo)))
#[14, 46, 28, 54, 44, 58, 26, 34, 64]




print (reduce(lambda x, y: x + y, foo))
#139
  上面例子中的map的作用,非常简单清晰。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。   




  比如上面map的例子,可以写成:print ([x * 2 + 10 for x in foo]) 非常的简洁,易懂。   




      filter的例子可以写成:print ([x for x in foo if x % 3 == 0]) 同样也是比lambda的方式更容易理解。
-------------------------------------------------------------------
Python闭包




如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量




复制代码
 def FuncX(x):
  def FuncY(y):
     return x * y
 return FuncY
 
tempFunc = FuncX(3)
result = tempFunc(5)
print(result) # 15




result = FuncX(3)(5)
print(result) # 1


 

 

猜你喜欢

转载自blog.csdn.net/doudou19930614/article/details/80428870