标签:generator name mic append 缺点 c++语言 职业发展 发生器 iterable
目录
sorted()
l=[1,3]
l.sort()
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。
sort是容器的函数,用List的成员函数sort进行排序
sorted是Python的内建函数相同的参数,用built-in函数sorted进行排序
sorted(iterable,key=None,reverse=False),返回新的列表,对所有可迭代的对象均有效
sort(key=None,reverse=False) 就地改变列表 reverse:True反序;False 正序
a = [1,4,36,87,56,45,23,43,23,12,13,14]
# a.sort()#是对自身的排序,不需要进行赋值
# print(a)
a1= sorted(a)#
print(a1)
l = {}
exec('''
school='oldboy'
def __init__(self,name):
self.name=name
def score(self):
print('分数是100')
''',{},l)
print(l)#{'school': 'oldboy', '__init__': <function __init__ at 0x000002ACADBD7318>, 'score': <function score at 0x000002ACADBD7168>}
g = {'x':1,'y':2}
l = {}
exec("""
global x
x = 100
z = 200
m = 300
""",g,l)
print(g)#{'x': 100, 'y': 2, ***}
# print(l)#{'z': 200, 'm': 300}
在python中一切皆对象,类实际上就是一个一个的对象。
我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类(元类可以简称为类的类)
type是内置的一个元类,所有的类都是由type实例化得到的。
如下,Person类也是一个对象,那么他一定是由一个类的实例化得到的,这个类就叫做元类。
<hr>
所谓类,它们的用途是将相关的数据和行为捆绑在一起。
类可以继承其父类的部分或全部性质,也可以定义自己的属性(数据)或方法(行为)。
所谓对象是自省的(也称为反射)。即,自省对象能够描述自己:实例属于哪个类?类有哪些祖先?对象可以用哪些方法和属性?自省让处理对象的函数或方法根据传递给函数或方法的对象类型来做决定。
所谓元类,在 Python(以及其它语言)中,类本身就是可以被传递和自省的对象。
既然可以用类作为模板来生成对象,那么用什么作为模板来生成类呢?答案是元类(metaclass)。
关于类工厂,不仅实例可以动态的创建,连类也可以动态地创建。
元类的功能是强大的,需要考虑元类对于我们的实用性,而且掌握它是有一定的难度的。最大的意义可能是实现“面向方面的程序设计(AOP)”
苦想的一个问题是:元类在有限元分析中能发挥什么作用?
作者认为元类在两大类编程任务中确实有用。
第一类(可能是更常见的一类)是在设计时不能确切地知道类需要做什么。
第二类是存在着某种特定的编程环境,其中类往往比实例更重要。
题目举例:将列表生成式中[]改成() 之后数据结构是否改变。
参考解析:这道题目的关键不在于其答案,而是背后的迭代器和生成器的概念。
生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。
回到上面的问题,将列表生成式中[]改成() 之后数据结构是否改变呢?答案:是,因为从列表(迭代器)变为生成器,代码如下:
题目举例:手写一个判断时间的装饰器。
参考解析:很明显,这道题目的考察重点是python的又一经典特性——装饰器。装饰器本质上是一个callable object,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能,其返回值也是一个函数的对象,经常用于有切面需求的场景,比如插入日志,性能测试,事务处理,缓存等等。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
对于上面这道题目,给出以下参考代码:
如果没有装饰器,执行test("backbp")的返回结果应该是Hello backbp, 2020 Happy
,但是在函数timecheck中,我们对当前时间的年份进行了判断,相当于给test函数增加了额外的功能。结果很明显,今年是2019年而非2020,因此就得到了上面的输出结果。
题目举例:Python中的猴子补丁是什么?
参考解析:猴子补丁仅指在运行时动态改变类或模块,即函数在python中可以像使用变量一样对它进行赋值等操作,为的是将第三方代码打补丁在不按预期运行的bug或者feature上,适用于python这种动态语言。
例如下面这段代码运行后会执行MyClass中的func函数。
现在我们在上面代码的基础上再添加两行代码:
MyClass.func = ClassName.monkey_funcobj.func()
再次执行会发现输出结果变为了‘monkey_func‘,在这个过程中我们通过对MyClass.func重新赋值,动态的改变了输出的结果。
题目举例:说明Python中==和is的区别。
参考解析:is是判读对象标识符是否一致,而==是判读两个对象的内容是否相等!
__eq__()
。例如下面这段代码,虽然a和b的值是相同的,但是二者是不同的两个对象,因此使用is比较得到的结果是False。
题目举例:对python中的深拷贝和浅拷贝进行说明。
参考解析:Python中对象的赋值实际上是简单的对象引用,也就是说当你创建一个对象,然后把它赋值给另一个变量的时候,Python并没有拷贝这个对象,而是调用了这个对象。而真正的拷贝分为浅拷贝和深拷贝两种。
浅拷贝一般使用copy.copy(),可以进行对象的浅拷贝,但是不会拷贝对象内部的子对象。例如:
上面这段代码中,使用copy对origin进行浅拷贝,cop复制了origin的对象,但是cop里面的[3, 4]和origin里面的[3,4]其实都是指向同一块内存地址,所以改变了origin[2][0]
之后,cop里面的内容也发生了改变!
深度拷贝需要用copy.deepcopy()进行,它会复制整个对象,以及它里面的所有子对象,例如:
当使用深度拷贝后,cop和origin已经是两个完全独立的对象,其中的元素及子元素都指向不同的内存地址,因此无论origin如何变化,cop都不会随之改变。
题目举例:说明python中可变类型和不可变类型的区别,并举例。
参考解析:可变类型传递的是内存中的地址,也就是说当进行修改操作时,会直接修改内存中的值,并没有开辟新的内存,可变类型的代表有list,dict。例如:
在上这段代码中,我们对lst进行了append操作,虽然lst的值改变了,但是其内存地址并没有发生变化。
不可变类型被改变时,并没有改变原内存地址中的值,而是开辟一块新的内存,将原地址中的值复制过去,对这块新开辟的内存中的值进行操作,其代表有string,number,tuple。例如:
可见,对字符串s进行操作后,其内存地址也随之发生了改变。
题目举例:简要说明什么是python的自省特性。
参考解析:自省就是面向对象的语言所写的程序在运行时,能够知道对象的类型。简单一句就是运行时能够获得对象的类型,比如type()、dir()、getattr()、hasattr()、isinstance()等方法。
例如下面这段代码中,type函数返回的是变量的数据类型,isinstance判断变量(参数1)是否属于某数据类型(参数2),dir函数则会返回参数的属性、方法列表。
题目举例:对python中的三种下划线形态_foo
、__foo
、__foo__
进行说明。
参考解析:python中不同的下划线组合具有不同的含义。
_foo
,这里的下划线是用来指定私有变量的一种方式,常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。__foo
,主要是为了区别和其他类相同的命名,避免该成员的名称与子类中的名称冲突。例如有有类class里有一成员 __x
,那么 dir(class) 时会看到_Test__x
而非__x
。__foo__
,定义的是Python 中的魔法对象,如类成员的__init__、__del__、__add__、__getitem__
、全局的__file__、__name__
等。例如下面这段代码中,我们直接调取mc的__superprivate
属性会提示MyClass这个类没有该属性,原因就是前置的双下划线对属性名称进行了限定。
# 惰性查询
# res = models.Book.objects.all()
# res = models.Book.objects.values('title')
# res = models.Book.objects.only('title')
# for r in res:
# # print(r.title)
# print(r.price)
"""
only会将括号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库
一旦你点了不是括号内的字段 就会频繁的去走数据库查询
"""
# res = models.Book.objects.defer('title') # defer和only互为反关系
# for r in res:
# print(r.title)
"""
defer会将括号内的字段排除之外将其他字段对应的值 直接封装到返回给你的对象中 点该其他字段 不需要再走数据库
一旦你点了括号内的字段 就会频繁的去走数据库查询
"""
# res = models.Book.objects.select_related('publish')
# res1 = models.Author.objects.select_related('author_detail')
# # res = models.Book.objects.all()
# for r in res1:
# print(r.author_detail)
# print(r.author_detail.phone)
# print(r.author_detail.addr)
"""
select_related 会自动帮你做连表操作 然后将连表之后的数据全部查询出来封装给对象
select_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
"""
# prefetch_related
res = models.Book.objects.prefetch_related('publish')
# print(res)
for r in res:
print(r.publish.name)
"""
prefetch_related 看似连表操作 其实是类似于子查询
prefetch_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
"""
"""
第一个 内部自动连表 消耗的资源就在连表上 但是走数据库的次数较少
第二个 内部不做连表 消耗的资源就在查询次数上 但是给用户的感觉跟连表操作一样
"""
学习python 的目的是为了更好的了解技术,能够通过自己的技术来创造一些比较有意义的项目,对我来说是非常有成就感的事情,
1.数据科学
可以创建脚本来自动化内容,进入Web开发等等。
2.机器学习
机器学习的发展在过去的几年中是惊人的,它正在迅速改变我们周围的一切。
算法日渐复杂,python提供了很多机器学习库。
3.网站开发
优质的开发是学习Python的另一个原因。它提供了许多好的库和框架,例如Django和Flask使Web开发变得非常简单。
PHP中需要花费数小时的任务可以在几分钟内完成。Python也被用于网络爬虫。像Reddit这样互联网上的一些流行网站是使用Python构建的。
4.简便
当你第一次开始编程时,你肯定不希望从具有严格语法和奇怪规则的编程语言开始。
Python既可读又简单,它也更容易设置,而不需要处理任何类路径问题,如Java或C++等编译器问题。
只需安装Python就可以了。安装它时还会要求你在PATH中添加Python,这意味着你可以从计算机上的任何位置运行Python。
5.强大的社区
你需要一个社区来学习新技术,而在学习编程语言方面,朋友是你最大的资产,当你遇到问题时,就需要朋友的援助之手。
由于Google,你可以在几分钟内找到任何问题的解决方案,像StackOverflow这样的社区也将许多Python专家聚集在一起,来帮助新手。
6.库和框架
Python和Java之间的一个相似之处是可以执行任何操作的开源库,框架和模块的数量,它使应用程序开发变得非常容易。
想象一下,不用Java的Spring或Django和Flask创建一个Web应用程序,工作变得简单,因为只需要关注业务逻辑。
Python有满足不同需求的库。Django和Flask是Web开发中最受欢迎的两个,而NumPy和SciPy是用于数据科学的。
实际上,Python拥有最好的机器学习和数据科学库集合,如TensorFlow,Scikit-Learn,Keras,Pandas等等。
7.自动化
由于某一次的脚本需求,我第一次了解了Python。我在使用通过UDP接收消息的应用程序时出现了问题,但我没有在日志中看到消息。
我想检查是否在该盒子和端口上接收了任何UDP流量,但我找不到一个方便的UNIX命令来做到这一点。
我的一位坐在我旁边的朋友正在学习Python,他在短短5分钟内编写了一个实用工具,使用了其中一个Python模块拦截UDP消息。
显然,我对他编写这样一个工具所花费的时间印象深刻,但这只是在编写脚本、工具和自动化时显示出了Python的强大功能。
8.多用途
我喜欢Python的一个原因是它的瑞士军刀性质。它关系着方方面面,例如R在数据科学和机器学习方面表现得很好,而且在Web开发方面也无处不在。学习Python意味着你可以做很多事情。
你可以使用Django和Flask创建Web应用程序,可以使用NumPy,Scipy,Scikit-Learn和NLTK进行数据分析。
至少,你可以使用Python编写脚本来自动完成许多日常任务。
9.工作与成长
Python的发展速度非常快,持续时间很长,如果你刚刚开始编程生涯,那么学习一门不断发展的编程语言会很有意义。
它不仅可以帮助你快速找到工作,而且还可以加速你的职业发展。恕我直言,对于初学者来说,除了它的简便性,这应该是学习Python的最重要原因。
10.薪水
Python开发人员是收入最高的开发人员之一,特别是在数据科学,机器学习和Web开发方面。
看书 首先把Python的基础教程看一遍,大概一周的时间.主要先学习Python的语法.然后后面就是看视频,试着写一些Demo,在应用中却学习总结.遇到问题就百度看博客.后面又去廖雪峰的官方博客,跟着敲了一遍.基础部分大概花了一个月的时间.后来就是直接学习Django框架,试着去写代码.遇到不会的就去百度.我感觉对于我来说,获取知识的途径,还是百度一个问题,然后去看博客上人家的分析,查询多个部分,直到自己弄明白为止
1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
C语言的优点:简洁紧凑、灵活方便;运算符丰富;数据类型丰富;表达方式灵活实用;允许直接访问物理地址,对硬件进行操作;生成目标代码质量高,程序执行效率高;可移植性好;表达力强;
C语言的缺点:C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。
2.C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。
生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。该过程实际上分成两个步骤。
第一步是对程序进行编译,这需要用到编译器(compiler)。编译器将C++语句转换成机器码(也称为目标码);如果这个步骤成功,下一步就是对程序进行链接,这需要用到链接器(linker)。链接器将编译获得机器码与C++库中的代码进行合并。C++库包含了执行某些常见任务的函数(“函数”是子程序的另一种称呼)。例如,一个C++库中包含标准的平方根函数sqrt,所以不必亲自计算平方根。C++库中还包含一些子程序,它们把数据发送到显示器,并知道如何读写硬盘上的数据文件。
3. C#语言,C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。首先,C# 和JAVA一样,简直就是照搬了C++的部分语法,因此,对于数量众多的C++程序员学习起来很容易上手,另外,对于新手来说,比C++要简单一些。其次,Windows是占垄断地位的平台,而开发Windows应用,当然微软的声音是不能忽略的。最重要的是,相对于C++,用C# 开发应用软件可以大大缩短开发周期,同时可以利用原来除用户界面代码之外的C++代码。
4. Java语言,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
Java的优势,与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
5.php语言,PHP(PHP: Hypertext Preprocessor的缩写,中文名:“PHP:超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。
特性:PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法;PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多,PHP具有非常强大的功能,所有的CGI的功能PHP都能实现; PHP支持几乎所有流行的数据库以及操作系统;最重要的是PHP可以用C、C++进行程序的扩展。
6.python语言,是一种面向对象、直译式计算机程序设计语言,Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。
解释型
解释型语言:可以直接运行,逐条翻译逐条运行
编译型
把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序
编译型语言,执行速度快、效率高;依赖编译器、跨平台性差些。如C、C++、Delphi、Pascal,Fortran。
解释型语言,执行速度慢、效率低;依赖解释器、跨平台性好。如Java、python.
编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
CPython
由C语言开发的 使用最广的解释器,在命名行下运行python,就是启动CPython解释器.
IPython
基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样
PyPy
目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率
JPython
运行在Java上的解释器 直接把python代码编译成Java字节码执行
IronPython
在微软 .NET 平台上的解释器,把python编译成. NET 的字节码
CPython
当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
在Python的解释器中,使用广泛的是CPython,对于Python的编译,除了可以采用以上解释器进行编译外,技术高超的开发者还可以按照自己的需求自行编写Python解释器来执行Python代码,十分的方便!
1.位:bit
一个二进制数据0或1,是计算机传输的最小单元.8位组成一个字节.
2.字节:byte
存储空间的计量单元,1个字节有8个bit.而1024个字节又代表1K
3.一个英文占用一个字节(编码而定)
1 字母 = 1byte = 8bit
4.一个汉字占用两个字节(编码而定)
1 汉字 = 2byte = 16位
5.标点符号(中英文)
中文占用两个字节,英文占用1个字节
1位=1比特
1字=2字节
1字节=8位
1字=16位
1字(word)= 2字节(byte)
1字节(byte) = 8位(bit)
b ,B,KB,MB,GB之间的关系
utf-8种一个字母或者 数字等于一个字节 , 一个汉字等于3个字节,表情等于4个字节
b 比特bit / 位
B——字节
KB——千比特
MB——兆比特
GB——吉比特
1 B = 8b (8个bit/ 位) 一个字节(byte)等于8位(bit)
1 kB = 1024 B (kB - kilobajt)
1 MB = 1024 kB (MB - megabajt)
1 GB = 1024 MB (GB - gigabajt)
英文和数字占一个字节
中文占一个字符,也就是两个字节
字符 不等于 字节。
字符(char)是 Java 中的一种基本数据类型,由 2 个字节组成,范围从 0 开始,到 2^16-1。
字节是一种数据量的单位,一个字节等于 8 位。所有的数据所占空间都可以用字节数来衡量。例如一个字符占 2 个字节,一个 int 占 4 个字节,一个 double 占 8 个字节 等等。
1字符=2字节;
1Byte=8bit
1k=2^10;b:位;B:字节1kb=1024 位1kB=1024 字节
1.变量命名规则:
不能与关键字重名,必须以数字字母下划线组成,且不能以数字开头
2.导包规则:
# 推荐这样写
import random
import sys
# 不推荐这样写
import random, sys
# 一行多个包可以这样写。
from random import random, randint
3.缩进
每一级使用四个空格缩进,要么都是用空格,要么都是用tab键,不要空格和tab键混用
4.每行最大字符限时为79个,除了长导包语句,和url地址
5.多个变量,之间使用逗号分隔,逗号与前变量相邻,与后变量之间空一格。
6.# TODO
标签:generator name mic append 缺点 c++语言 职业发展 发生器 iterable
原文地址:https://www.cnblogs.com/SkyOceanchen/p/11774491.html