介绍Python的太空冒险
本文不针对绝对的初学者。 它是专门为JS开发人员或类似人员寻找令人难以置信的流行编程语言Python的有趣介绍。 解释了许多概念:语言的多重继承,列表理解,基础和特殊性。 所有代码都可以立即复制/粘贴到一个repl中,并且在文章末尾有一个repl可直接查看。
在90328443435329598的宇宙中。 两个新生命来自虚无……
你好,人类。 你叫马塞尔(Marcel),所以我听说了。 您是7530305890人类中的一员。
我是一个蟒蛇 ,我的名字叫Guido,是3种蟒蛇之一。
现在,有:90328443435329600外星生物。
现在,一些代码可以完全编译为上面的代码:
total_aliens = 90328443435329598
。 也就是说,Python是动态类型的。
class Alien(object):
以及class Human(Alien):
表示Alien类从类object继承,而Human从类Alien继承。
def
只是函数的创建方式。
__init__
是创建类的新实例时自动运行的东西,它是初始化程序。
self
:类中的每个方法都必须有第一个参数。 它不一定是self
但这是惯例。 这是自我的目的,摘自Stack Overflow的简要描述:
-
instance_object.parent_class_method(arg)
内部转换为:parent_class.parent_class_method(instance_object, arg)
。 所以self
结合实例对象的方法调用,类似this
的JS,一些细微之处是需要注意的。
最后, global
:如上编写它引用了全局变量,因此可以在函数范围内对其进行更改。
super
与Human继承自Alien的直接父类进行交互。 该参数将新实例的self.being
设置为与human
相等。
当您编写空函数, if/else
空或类似的东西时,在Python中必须pass
。 如果不pass
发生错误。
如图所示,将创建一个新实例。 print
是注销值的方式。
与类的实例相关联的值的获取是通过点表示法完成的。
好了,进入函数式编程并继续讲故事。
人类,要离开这个星球,您必须完成六个任务:
为了离开这个星球,有一个生成器函数可以运行您克服问题的每个实例。 这为您的飞船回家积聚了燃料。 这是功能:
首先,我给您一个列表( ['str_1', 'str_2', …]
),其中有六个字符串。 您必须检查每个字符串的第一个字母是数字(a为0,b为1,依此类推),然后检查该索引是否存在于列表中,最后将该字符串添加到新列表中。 返回新列表。
这将返回['damnation', 'fuggedaboutit', 'zoological', 'buttercup']
。
[]
:在这种情况下,它是一个列表,而不是数组。 它们略有不同。
- 主要区别在于:
array([3, 6, 9, 12])/3.0
[3, 6, 9, 12]/3.0
array([3, 6, 9, 12])/3.0
(数组语法)返回array([1, 2, 3, 4])
而[3, 6, 9, 12]/3.0
(列表语法) )返回错误。
for str in strs:
是人们在Python中看到的主要循环类型。 从第零个索引开始,遍历每个索引的值。
some_list.append(some_value)
将指定的值推到列表的末尾。
some_list.index(some_value)
在列表中寻找some_value
并返回存在该值的第一个索引。 如果找不到,则会发生ValueError
异常。
您的位置:17%的燃料。 现在,另一个任务。 另一个功能。 第一个参数:一个数字。 第二个参数:字典( {'some_key': 'some_value', …}
)包含一个名为 a_list
的键 ,其值是一个充满字符串的列表( 'a_list':[...]
)和一个分隔符( 'separator': 'something'
)。 因此: {'a_list': […], 'separator': 'something'}
)。 第一个参数指定从列表中使用多少个字符串。 将与分隔符连接的每个字符串存储到单个变量或内存位置,然后将其返回。
这将返回: 'Trump is terrible! Genghis Khan is terrible! That noisy person is terrible! '
'Trump is terrible! Genghis Khan is terrible! That noisy person is terrible! '
range(num)
是指定数字的迭代器。 如果只有一个参数,则从零迭代到数字减一。 Range可以接受三个参数,类似于浓缩的for循环: range(-10, -100, -30) => -10 -40 -70
, for this_thing_is in range(...)
=>
值。
{...}
:字典是无序的键/值对或关联数组。 键必须是字符串,并且要通过括号表示法访问值,还必须插入字符串值或变量名。
您现在的位置:34%。 接下来,我提出了一个更加令人困惑的挑战。 首先,您不知道给出了多少个参数! 第一组参数包含数字,值None或字符串。 第二组包含以这种方式关联的键/值对: some_keyword=some_value
。 some_keyword
将是一个字符串。 some_value
将是一个数字。 返回字典。 一键/值。 **只能是我最初给您提供的字符串(参数)的顺序是相反的。 该值必须是连接的字符串,只能将关键字中的字符串从零索引到指定为值的数字一起使用,所有字符串都变成一个没有空格的字符串。
登出: {'big amazing animal': 'elephant'}
。
如果在reversed(args)
之前打印出args,则会看到args为:( ('animal', 'amazing', None, 6, 'big')
。 这是一个元组。 一系列不可变的对象。 元组用括号编写,并且不能像更改列表或数组一样用特定的索引进行更改。
enumerate
允许一个拥有一个自动计数器并同时访问这些值。
if/elif/else
是如何编写if / else语句。
is None
是一种返回true或false值以检查None
值的方式。 它类似于null
,但越是这样undefined
的JS作为代码许多情况下,可以通过高阶函数返回该值,如当一个会改变一个列表,人们不会想到返回的东西或者当一个函数不返回任何东西,它返回None
。
isinstance(arg, int)
用于检查arg是否为指定类的实例。 在这种情况下为int
,但也可以这样表示:
-
isinstance(marcel, Alien)
将返回true。 类,字符串,整数和您期望的所有其他内容都可以通过这种方式检查。
好好 你是51%。 现在,一个有趣的。 您会得到一个矩阵。 列表中有三个列表,每个列表内部都有四个字符串。 首先,创建一个新列表,将每个列表的每个索引这样关联:( [[[0][0], [1][0], [2][0]…],[[0][1], [1][1]…], ...]
),然后将每个列表展平为单个字符串,最后将该列表连接为一个字符串。 您可以将所有这些逻辑放入一个语句中……一个列表理解。
这将返回: You must make it look this way. Very extremely, magically, important thing to do!
You must make it look this way. Very extremely, magically, important thing to do!
首先: [[row[i] for row in matrix] for i in range(4)]
。 同样的事情:
必须从最外部的括号/逻辑上进行思考。
因此: [all_the_logic]
就是说:创建一个新列表,在这里进行的所有操作将最终确定列表的外观。
[[some_inner_logic] for i in range(4)]
:这将指定有4行,并且[row[i] for row in matrix]
在每个实例中得到的结果就是每行将是什么。
[row[i] for row in matrix]
表示使用范围的索引i(0、1、2、3),因为它在创建第一,第二,第三和第四行时是恒定的。 在每行创建期间,会发生以下情况:
- 循环遍历
matrix
每一行=>将row[i]
处的值推入此新创建的列表=>将此列表追加到最初创建的列表中。
在这一点上,这就是创建的内容: [['You', 'must', 'make'], ['it', 'look', 'this'], ['way.', 'Very', 'extremely,'], ['magically', 'important', 'to do!']]
。 转置矩阵。
上: [str for sublist in [transposed_matrix] for str in sublist]
再次,向外括号到最里面。
创建新列表: [result_of_logic]
从最远的for循环读取: sublist in [transposed_matrix]
说:循环遍历矩阵中的每个列表,从第一个开始。
然后阅读下一个for循环: for str in sublist
。 这相当于说要遍历此sublist
每个str
。 这就是现在可以添加到列表的值。
最后,看一下列表理解的开头: str
。 那就是追加到列表的内容: ['current_str', 'second_str', ...]
。 因此,从某种意义上讲,最左边的值将被推入新创建的列表中,直到循环完成为止。 好像append
自动发生。
至于: ''.join(final_list)
, ''
是字符串分隔符。
注意最左边的for
循环是第一次发生的,最右边的是嵌套。
好的,现在您的比率为68%,只剩下两个! 我需要您创建一个工厂功能。 将实现五个功能。 append
(推送到列表的末尾), extend
(将一个列表 合并 到另一列表), insert
(将项目插入特定的索引), remove
(删除指定项目的每个实例)和 pop
(弹出列表中的最后一个项目)。 您不能使用等效的高阶函数,并且创建的每个函数 都不能使原始列表发生变异 。 给您三个或四个参数。
- 一个列表
- 函数名称作为字符串
- 函数需要的一个参数,如果需要则为四个索引(用于插入)
- 一个项目(仅用于插入)
好的祝你好运!
要知道,这些功能并不是实现此目的的最佳方法。 使用关联的高阶函数要快得多。 另外,知道高阶函数都返回None
但pop
会返回弹出的内容。
append
和extend
:这只是Python的精妙之处。 将列表添加到另一个列表会自动合并两个列表。 li.append(item)
和li.extend(other_li)
是正确的语法,但是这两个选项会li.extend(other_li)
原始列表,而上面编写的选项则不会。 other_li
在extend
不突变虽然。
在这种情况下, insert
和pop
都使用切片。 我将重点介绍insert
。 注意: the_list[:idx]
:这意味着将列表切成索引,但不包括索引。 the_list[idx:]
:是指从索引开始直到列表的最后一个索引切片。
remove
:一个简单的列表理解(顺便说一句,它们操作非常快)。 [x for x in the_list if x != item]
: new_list = []
=> if x != item:
列表for x in the_list:
=> if x != item:
=> new_list.append(x)
或,但从技术new_list += [x]
,不是new_list += [x]
。 但是,请注意,真正的li.remove(item)
仅删除该li.remove(item)
的首次出现。 此remove
将删除所有出现的事件。
做得很好,进入下一个。 您的燃油含量为85%,这是最后一个! 下一个有点奇怪,因为它是两个功能合而为一。 我要给您各种各样的关键字和参数。 您的函数将被调用多次,其中包含随机数量的参数或无参数。 和/或多种关键字。 我需要您将我提供给您的所有参数值存储在非全局列表中,并将所有关键字值存储在非全局字典中。 这样返回字典: {'the_list': [...], 'the_dictionary': {...}}
。 每次调用该函数时,都会根据输入内容更改列表或更改字典, 并将所有值附加到先前的调用值中。
最后,将最终调用列表作为第一个参数解压缩,并将字典作为第二个参数解压缩到另一个函数中。
(*args, li=[], dic={}, **keywords)
:请注意,这两个不是关键字或参数的参数都在这两个调用之间,这是必需的。
但是真正奇怪的部分是,为什么在每次函数调用期间li
和dic
不断发生突变? Python不会为每个函数调用创建每个参数的副本,但会保留对原始默认参数的引用,如果不小心,它们很容易陷入创建非纯函数的陷阱。
作为用于这样的: back_to_earth(*dictionary_and_list()['a_list],
这是一个如何可以解开列表成一个函数,以便在列表中每个项目成为一个单独的参数值与抓起*args
。至于**dictionary_and_list()['a_dictionary])
:这**dictionary_and_list()['a_dictionary])
字典值解压缩到函数参数中。 函数中在词典中具有关联键的每个关键字都将获得该值。
以及代码输出:
好吧,你在那里:100%! 好的,您完成了,该离开这个Python世界了。 恭喜您取得了所有成就! 再见!
标题
3
背部
2
至
1个
地球!
0
最后但并非最不重要的一点是,在完成每个功能之后,我运行了liftoff.__next__()
。 如下面的代码所示。 一件事要知道。 如果再运行一次,则会发生错误。 为什么? 好吧,生成器功能只能读取一次,不能再读取。 因此,当迭代完成时,不再有.__next__()
并且所有先前的值都已被垃圾回收。
所有代码都放在一个地方:
和代表:
需要注意的其他事项:
- 文件名,变量名和函数名用下划线命名。
- 缩进:4个空格是惯例。
- CamelCase很少使用,仅在类中使用。
- 如果变量是globalthenitisall小写(如果变量是global,则全部为小写)。
谢谢阅读。 任何与本文有关的建议,想法,评论,想法,掌声或您想做的其他事情,将不胜感激!
From: https://hackernoon.com/https-medium-com-muzsik33-a-space-adventure-introducing-python-7cde79b53219