“人造太阳”计划

(转)知无涯之C++ typename的起源与用法

跟風遠走 提交于 2019-12-04 23:18:07
侯捷在Effective C++的中文版 译序 中提到: C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, object-based, object-oriented, generics 对于较少使用最后一种泛型编程的我来说,程序设计基本上停留在前三种思维模式当中。虽说不得窥见高深又现代的泛型技术,但前三种思维模式已几乎满足我所遇到的所有需求,因此一直未曾深入去了解泛型编程。 目录 起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译器对错误情况的处理 使用typename的规则 其它例子 再看常见用法 参考 写在结尾 起因 近日,看到这样一行代码: typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor; 虽说已经有多年C++经验,但上面这短短一行代码却看得我头皮发麻。看起来它应该是定义一个类型别名,但是 typedef 不应该是像这样使用么, typedef +原类型名+新类型名: typedef char* PCHAR; 可为何此处多了一个 typename ?另外 __type

2.深入类和对象

拜拜、爱过 提交于 2019-12-04 23:05:20
1.1.鸭子类型和多态 “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。 实例一: # 鸭子类型和多态简单实例 class Dog(object): def say(self): print('a dog') class Cat(object): def say(self): print('a cat') class Duck(object): def say(self): print('a duck') animal_list = [Dog,Cat,Duck] for animal in animal_list: animal().say() #运行结果 a dog a cat a duck 实例二: 类只要实现了__getitem__方法,它就是可迭代的,并不关心对象的本身,只关心行为,然后就可以当做extend的参数。 class Company(object): def __init__(self, employee_list): self.employee = employee_list def __getitem__(self, item): return self.employee[item] company = Company(["11", "22", "33"])

[LeetCode] 173. Binary Search Tree Iterator_Medium_tag: Binary Search Tree

人盡茶涼 提交于 2019-12-04 16:43:50
mplement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Example: BSTIterator iterator = new BSTIterator(root); iterator.next(); // return 3 iterator.next(); // return 7 iterator.hasNext(); // return true iterator.next(); // return 9 iterator.hasNext(); // return true iterator.next(); // return 15 iterator.hasNext(); // return true iterator.next(); // return 20 iterator.hasNext(); // return false Note: next() and hasNext() should run in average O(1) time and uses O( h )

迭代器

独自空忆成欢 提交于 2019-12-04 11:59:42
迭代器 迭代器:迭代的工具。迭代是更新换代,如你.爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复 while True: print('*'*10) 一、可迭代对象 python中一切皆对象,如 x = 1 name = 'nick' lis = [1, 2] tup = (1, 2) dic = {'name': 'nick'} s1 = {'a', 'b'} def func(): pass f = open('49w.txt', 'w', encoding='utf-8) 对于这一切的对象中,但凡有 __iter__ 方法的对象,都是可迭代对象。 # x = 1.__iter__ # SyntaxError: invalid syntax # 以下都是可迭代的对象 name = 'nick'.__iter__ lis = [1, 2].__iter__ tup = (1, 2).__iter__ dic = {'name': 'nick'}.__iter__ s1 = {'a', 'b'}.__iter__ f = open('49w.txt', 'w', encoding='utf-8') f.__iter__ f.close() 1.1

迭代器

最后都变了- 提交于 2019-12-04 09:40:56
1.装饰器补充 1.叠加装饰器 装饰的顺序: 由下到上装饰 执行的顺序: 由上往下 def wrapper1(func): def inner1(*args, **kwargs): print('1---start') # 被裝飾對象在調用時,如果還有其他裝飾器,會先執行其他裝飾器中的inner # inner2 res = func(*args, **kwargs) print('1---end') return res return inner1​​def wrapper2(func): def inner2(*args, **kwargs): print('2---start') res = func(*args, **kwargs) print('2---end') return res return inner2​​def wrapper3(func): def inner3(*args, **kwargs): print('3---start') res = func(*args, **kwargs) print('3---end') return res return inner3​'''叠加裝飾器的裝飾順序與執行順序: - 裝飾順序: 调用wrapper装饰器拿到返回值inner 由下往上裝飾 - 執行順序: 调用装饰过后的返回值inner 由上往下執行'''​​

迭代器

孤者浪人 提交于 2019-12-04 09:37:57
迭代器 是用来迭代取值的工具。迭代指的是重复迭代,每一次迭代哦都是基于上次结果来的,单纯的重复不是迭代。 可迭代对象 :凡是内部有__iter__()方法的都是可迭代对象,所有的序列类型:list,str,tuple,dict,set,文件f都是可迭代对象。 如何获取迭代器对象 : 通过可迭代对象.__iter__()得到的返回值就是迭代器对象 例: str1 = 'hello' iter_str1 = str1.__iter__() print(iter_str1) # 得到迭代器对象 print(iter_str1.__next__()) # 通过.__next__()进行迭代取值 ===》 h print(iter_str1.__next__()) # 每执行一次从迭代器对象中取一个值 ===》e 如果迭代器对象中的值被取完,程序会报错,则需要进行捕获异常 例: list1 = [1,2,3,4,5] iter_list1 = list.__iter__() while True:   try:     print(iter_list1.__next__())   except StopIteration # 通过 try 和 except 捕获异常 迭代器对象的优缺点 : 优点:1.不依赖于索引 迭代取值; 2.节省内存空间 缺点:1.每次取值都只能取当前第一个值

迭代器

二次信任 提交于 2019-12-04 09:17:36
迭代器    迭代器即迭代的工具     迭代:迭代指的是重复迭代,每一次迭代都是基于上一次的结果而来的。     迭代器:迭代器指的是迭代取值的工具,他可以迭代取值。   如果想要知道python中迭代器是什么?必须先知道什么是可迭代对象?      可迭代对象:所有的序列类型:str , list ,tuple , dict , set ,f    凡是内部有str.__ iter __ ()方法的都是可迭代对象。      获取迭代器:      通过可迭代对象.__ iter __(),得到的返回值都是“迭代器对象”。      迭代器是迭代取值的工具,作用是迭代取值   如何迭代取值:      迭代器对象.__ next __() #"每一次执行",都会从迭代器对象中取出一个值 # 测试迭代文件 f = open('user.txt', 'r', encoding='utf-8') iter_f = f.__iter__() while True: try: print(iter_f.__next__()) except StopIteration: break str1 = 'hello tank' # 先获取迭代器对象 iter_str1 = str1.__iter__() while True: try: print(iter_str1.__next__())

python语法之迭代器

与世无争的帅哥 提交于 2019-12-04 09:05:53
可迭代对象 :可以重复取值,并且每一次的取值都是在上一次的结果之上而来的。凡是内部有_iter_()方法的都是可迭代对象。 迭代器对象 :通过序列类型._iter_(),得到返回值就是迭代器对象。 迭代取值方式: print(迭代器对象._next_()) for循环内部原理: for item in 可迭代对象: print item #重复迭代,每一次迭代的结果都是基于上一次的结果而来的 #可迭代对象:str, list, tuple, set, dict, f文件 # str = 'hello world' # list = [1,2,3] # tuple = (4,5,6) # dict = {'name':'nick','age':18} # set = {7,8,9} # f = open('a.txt','r',encoding='utf-8') #str 示范 # str_iter = str.__iter__() #通过str._iter_()获取迭代器对象str_iter # print(str_iter.__next__()) #通过迭代器对象str_iter._next_()获取值 # print(str_iter.__next__()) # print(str_iter.__next__()) #因为上述做法都是重复,可写成循环 #循环版本 #str

叠加装饰器与迭代器

﹥>﹥吖頭↗ 提交于 2019-12-04 09:02:06
一、叠加装饰器 在同一个被装饰对象中,添加多个装饰器,并执行,模板: 1 模板: 2 @装饰器1 3 @装饰器2 4 ... 5 def 被装饰对象(): 6 pass 注意:装饰器在调用被装饰对象时才会执行添加的功能 - 叠加装饰器:   - 装饰的顺序: 由下到上装饰   - 执行的顺序: 由上往下 注意: 无论inner中出现任何判断,最后都要返回“调用后的被装饰对象” func(*args, **kwargs) # 需求: 为被装饰对象,添加统计时间 与 登录认证功能 import time # 定义一个全局变量,表示用户是否验证通过 login_info = { 'login': False } # 登录功能 def login(): # 判断用户没有登录时,执行登录功能 name = input("username:").strip() pwd = input('password:').strip() if name == 'abc' and pwd == '123': print('登录成功!') login_info['login'] = True else: print('登录失败!') # 登录认证装饰器 def login_auth(func): def inner1(*args, **kwargs): """ 注意: 无论inner中出现任何判断,

实现迭代器(__next__和__iter__)

拜拜、爱过 提交于 2019-12-04 09:01:03
实现迭代器(__next__和 iter ) 一、简单示例 死循环 class Foo: def __init__(self, x): self.x = x def __iter__(self): return self def __next__(self): self.x += 1 return self.x f = Foo(3) for i in f: print(i) 二、StopIteration异常版 加上StopIteration异常 class Foo: def __init__(self, start, stop): self.num = start self.stop = stop def __iter__(self): return self def __next__(self): if self.num >= self.stop: raise StopIteration n = self.num self.num += 1 return n f = Foo(1, 5) from collections import Iterable, Iterator print(isinstance(f, Iterator)) True for i in Foo(1, 5): print(i) 1 2 3 4 三、模拟range class Range: def _