“人造太阳”计划

12. 迭代器,闭包,函数名的运用

拟墨画扇 提交于 2019-12-06 03:04:01
11. 前 方 高能 - 迭代器 本节主要内容: 函数名的使 用以及第 一类对象 闭包 迭代器 一. 函数名的运 用. 函数名是 一个变量量, 但它是 一个特殊的变量量, 与括号配合可以执 行行函数的变量量. 1. 函数名的内存地址 def func(): print("呵呵") print(func) 结果: <function func at 0x1101e4ea0> 2. 函数名可以赋值给其他变量量 def func(): print("呵呵") print(func) a = func # 把函数当成 一个变量量赋值给另 一个变量量 a() # 函数调 用 func() 3. 函数名可以当做容器类的元素 def func1(): print("呵呵") def func2(): print("呵呵") def func3(): print("呵呵") def func4(): print("呵呵") lst = [func1, func2, func3] for i in lst: i() 4. 函数名可以当做函数的参数 def func(): print("吃了了么") def func2(fn): print("我是func2") fn() # 执 行行传递过来的fn print("我是func2") func2(func) #

Python之路Day11

半城伤御伤魂 提交于 2019-12-06 02:58:27
函数名的第一类对象及使用 当作值,赋值给变量 def func(): print(1) print(func) #查看函数的内存地址 a=func print(a) a()    可以当作容器中的元素 def func(): print(1) def foo(): print(2) #lst.append(func) #lst.append(foo) #print(lst) ​ lst=[func,foo] #放到列表 for i in lst: i() dic={} #放到字典中    函数名可以当作函数的参数 def func(a): a() print(111) def foo(): print(222) def f1(): print(333) func(f1) foo()    函数名可以当作函数的返回值 def func(): def foo(): print(111) return foo func()()    f-strings 格式化 f"{}" 迭代器 可迭代对象 list,tuple,str,set,dict 取值方式只能直接看 只要具有 _iter_() 方法就是一个可迭代对象 s._iter_() -- 将可迭代对象转换成迭代器 具有 _iter_()和_next_() 两个方法的才是迭代器 迭代器再执行 _iter_ 还是原来的迭代器 for

list iterator not incrementable

喜你入骨 提交于 2019-12-05 19:50:41
在VC6中 list<T*> Tlist; list<T*>::iterator iter; iter=Tlist.end(); 再 iter++; 此时iter的游标位置和iter.begin()相等 但在VC6以后的版本中,比如VC2002,2005,2008中 list<T*> Tlist; list<T*>::iterator iter; iter=Tlist.end(); 再 iter++; 此时iter的游标位置不是iter.begin(),而是一个空的位置 这时会报出 list iterator not incrementable 错误 解决办法如下: list<T*> Tlist; list<T*>::iterator iter; iter=Tlist.end(); if(iter==Tlist.end()) { iter=Tlist.begin(); } else { iter++; } 这样做就躲避掉了VC6以后版本因为end()++不等于begin()而导致的错误 在各种版本中均使用正常不报错 来源: oschina 链接: https://my.oschina.net/u/101842/blog/10461

Python函数高级

主宰稳场 提交于 2019-12-05 19:35:26
一、 闭包函数 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 def outter(x): x = 1 def inner(): print(x) return inner f = outter(2) f() # 1 f() # 1 f() # 1 # 查看闭包的元素 print(f.__closure__[0].cell_contents) # 1 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得, 该函数无论在何处调用,优先使用自己外层包裹的作用域。 1、应用领域: 延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。 import requests def outter(url): def get(): response = requests.get(url) print(f"done: {url}") return get baidu = outter('https://www.baidu.com') python = outter('https://www.python.org') baidu() baidu() python() python() 二、 装饰器 装饰器指的是为被装饰器对象添加额外功能

迭代器

梦想的初衷 提交于 2019-12-05 19:27:36
双下方法print([1].__add__([2]))print([1]+[2]) 迭代器 l = [1,2,3] 索引 循环 for for i in l: i for k in dic: pass list dic str set tuple f = open() range() enumerate print(dir([])) #告诉我列表拥有的所有方法 ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10))) print(ret) #iterable print('__iter__' in dir(int)) print('__iter__' in dir(bool)) print('__iter__' in dir(list)) print('__iter__' in dir(dict)) print('__iter__' in dir(set)) print('__iter__' in dir(tuple)) print('__iter__' in dir(enumerate([]))) print('__iter__' in dir(range(1))) 只要是能被for循环的数据类型 就一定拥有__iter__方法 print([].__iter__())一个列表执行了__iter__(

第四章迭代器和生成器

二次信任 提交于 2019-12-05 06:46:01
Python CookBook 笔记 第四章迭代器和生成器 4.1 手动遍历迭代器 iter()函数可以将list转换为迭代器,从而使用next()函数获取迭代器结果 4.2实现迭代器协议 Python 的迭代协议要求一个 iter () 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 next () 方法并通过 StopIteration 异常标识迭代的完成 class Node2: def __init__(self, value): self._value = value self._children = [] def __repr__(self): return 'Node({!r})'.format(self._value) def add_child(self, node): self._children.append(node) def __iter__(self): return iter(self._children) def depth_first(self): return DepthFirstIterator(self) class DepthFirstIterator(object): ''' Depth-first traversal ''' def __init__(self, start_node): self._node = start

多任务-协程

放肆的年华 提交于 2019-12-05 05:15:09
目录   迭代器   生成器   协程-yield   协程-greenlet   协程-gevent   进程、线程、协程区别    一、迭代器     迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。   1.可迭代对象     我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代     但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,既供我们迭代吗?        >>> for i in 100:   ... print(i)   ...   Traceback (most recent call last):   File "<stdin>", line 1, in <module>   TypeError: 'int' object is not iterable   >>>   # int整型不是iterable,即int整型不是可以迭代的   # 我们自定义一个容器MyList用来存放数据,可以通过add方法向其中添加数据   >>> class MyList(object):

迭代器

一曲冷凌霜 提交于 2019-12-05 04:19:21
迭代器 默认参数的一个考点 当你的默认参数是可变数据类型的时候,那么你要当心了 def func(a,lst = []): 可变数据类型使用的是同一个内存空间 lst.append(a) return lst print(func(1)) -----[1] print(func(2)) -----[1, 2] print(func(3,[])) -----[3] 函数名的应用 函数名是一个特殊变量,它具有变量的特点 函数名指向的是函数的内存地址,这个内存地址加上()就可以运行函数. 函数名是一个变量,可以赋值运算 def func(): print(666) print(func) a = func a() # 也可以运行函数funcdef func(): print(666) print(func) a = func a() # 也可以运行函数func 函数名可以作为容器类类型的元素 def func(): print(666) lst = [func,func,func] lst[1]() for el in lst: el() 函数名可以作为函数的实参传进去 def func1(): print('in func1') def func2(argv): argv() print('in func2') func2(func1) 函数名可以作为函数的返回值 def func1(

Python常见的高级特性

廉价感情. 提交于 2019-12-05 03:18:45
Python高级特性(迭代器&生成器等) 正负索引就不提及了,都是比较基本的用法。 1234567891011121314151617181920212223242526272829303132333435363738 a = list(range(11))a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]a[2:8][2, 3, 4, 5, 6, 7]#负数索引切片a[-4:-2][7, 8]#指定步长切片a[::2][0, 2, 4, 6, 8, 10]>>> a[::-2][10, 8, 6, 4, 2, 0]#列表赋值切片>>> b = [1,2,3,4,5]>>> b[2:3] = [0,0]>>> b[1, 2, 0, 0, 4, 5]>>> b[1:1] = [8,9]>>> b[1, 8, 9, 2, 0, 0, 4, 5]>>> b[1:-1] = []>>> b[1, 5]#用slice()函数切片>>> a = list(range(6))>>> a[0, 1, 2, 3, 4, 5]>>> sa = slice(-3,None)>>> saslice(-3, None, None)>>> a[sa][3, 4, 5] 迭代 基本迭代 给定 list 或 tuple 可以通过 for 循环来遍历,这种遍历称为 迭代 (iteration)

第9章 顺序容器

て烟熏妆下的殇ゞ 提交于 2019-12-05 03:04:28
exercises section 9.2 9.2 list<deque<int> > list_deque_int; section 9.2.1 迭代器 1、迭代器与容器一样有公共的接口(forward_list的迭代器不支持递减运算符(--) exercise section 9.2.1 9.3、 1.迭代器必须指向同一个容器中的元素,或者容器最后一个元素之后的位置。 2.end不在begin之前。 9.4、 //p9_4.cpp #include <vector> #include <iostream> using namespace std; bool find(vector<int>::iterator first, vector<int>::iterator last, int val) { bool exist = false; //用来指示是否找到指定值,初始为false for(auto ix = first; ix != last; ++ix)//遍历迭代范围 { if(*ix == val) //若值相等 { exist = true; //说明找到了指定的值 break; //停止迭代 } } return exist; //返回exist,若存在则exist为true,否则为false } 9.5、 vector<int>::iterator find