python进阶----高阶函数,返回多值,集合set和三目,上下文管理器

高阶函数(map,filter,reduce)

#map(function_to_apply, list_of_inputs)
items=[1,2,3]
squared =list (map(lambda x: x**2,items))
for i in squared:
	print(i)

def multiply(x):
        return (x*x)
def add(x):
        return (x+x)

funcs = [multiply, add]
for i in range(5):
    value = map(lambda x: x(i), funcs)
    print(list(value))
 #filter过滤列表中的元素,并且返回一个由所有符合要求的元素所构成的列表,符合要求即函数映射到该元素时返回值为True.
number_list = range(-5, 5)
less_than_zero = filter(lambda x: x < 0, number_list)
print(list(less_than_zero))
#reduce
from functools import reduce
product =reduce((lambda x , y :x*y ),[1,2,3])
print(product)

返回多值

#最著名的方法,是使用global关键字 不要试着使用这方法。重要的事情说三遍,不要试着使用这方法!

def profile():
    global name
    global age
    name = "Danny"
    age = 30

profile()
print(name)
print(age)
#有些人试着在函数结束时,返回一个包含多个值的tuple(元组),list(列表)或者dict(字典),来解决这个问题。这是一种可行的方式,而且使用起来像一个黑魔法:
def profile():
    name = "Danny"
    age = 30
    #return name,age 
    return {'name':name,'age':age}
    #return [name,age]
    #return (name, age)

profile_data = profile()
#print(profile_data[0])
#print(profile_data[1])
print(profile_data['name'])
print(profile_data['age'])

集合set和多三目运算

#set(集合)是一个非常有用的数据结构。它与列表(list)的行为类似,区别在于set不能包含重复的值
some_list =['a','b','c','a','c','d']
duplicates = set([x for x in some_list if some_list.count(x)>1])
print(duplicates)
#交集
another_list = set(['a','b','c','f'])
some_list =set(some_list)
print(another_list.intersection(some_list))
#差集
print(another_list.difference(some_list))
#也可以用{}符号来创建集合
a_set = {1,2,3}
print(type(a_set))

#三元运算:三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(false)的条件判断,在Python 2.4以上才有了三元操作。
#如果条件为真,返回真 否则返回假
#condition_is_true if condition else condition_is_false
is_fat = True
state = "fat" if is_fat else "not fat"
print(state)
#(返回假,返回真)[真或假]
#(if_test_is_false, if_test_is_true)[test]
fitness = ('skinny','fat')[is_fat]
print(fitness)


上下文管理器

import io
with open('mk.jpg','rb') as file:
	jpgdata = file.read()
if jpgdata.startswith(b'\xff\xd8'):
	text = 'this is a jpeg file (%d bytes long )\n'
else:
	text = 'this is a random file(%d bytes long)\n'

with io.open('summary.txt','w',encoding='utf-8') as outf:
	outf.write(text % len(jpgdata))


"""
上下文管理器(Context managers)

上下文管理器允许你在有需要的时候,精确地分配和释放资源。

使用上下文管理器最广泛的案例就是with语句了。
基于类的实现
一个上下文管理器的类,最起码要定义__enter__和__exit__方法。

"""
class File(object):
	def __init__(self,filename,method):
		self.fileObject = open(filename,method)
	def __enter__(self):
		return self.fileObject
	def __exit__(self,type,vaue,traceback):
		self.fileObject.close()
with File("summary.txt",'a') as outf:
	outf.write('\nhello')
"""

    with语句先暂存了File类的__exit__方法
    然后它调用File类的__enter__方法
    __enter__方法打开文件并返回给with语句
    打开的文件句柄被传递给opened_file参数
    我们使用.write()来写文件
    with语句调用之前暂存的__exit__方法
    __exit__方法关闭了文件
"""
#我们还没有谈到__exit__方法的这三个参数:type, value和traceback。
#Python会将异常的type,value和traceback传递给__exit__方法。
#它让__exit__方法来决定如何关闭文件以及是否需要其他步骤

#处理异常
with File("summary.txt",'a') as outf:
	outf.undefined_function('\nhello')
"""

    它把异常的type,value和traceback传递给__exit__方法
    它让__exit__方法来处理异常
    如果__exit__返回的是True,那么这个异常就被优雅地处理了。
    如果__exit__返回的是True以外的任何东西,那么这个异常将被with语句抛出。
"""
class File(object):
    def __init__(self, file_name, method):
        self.file_obj = open(file_name, method)
    def __enter__(self):
        return self.file_obj
    def __exit__(self, type, value, traceback):
        print("Exception has been handled")
        self.file_obj.close()
        return True

with File('demo.txt', 'w') as opened_file:
    opened_file.undefined_function()





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值