介绍Python的太空冒险

本文不针对绝对的初学者。 它是专门为JS开发人员或类似人员寻找令人难以置信的流行编程语言Python的有趣介绍。 解释了许多概念:语言的多重继承,列表理解,基础和特殊性。 所有代码都可以立即复制/粘贴到一个repl中,并且在文章末尾有一个repl可直接查看。

在90328443435329598的宇宙中。 两个新生命来自虚无……

Python外星人
你好,人类。 你叫马塞尔(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 -70for 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 (弹出列表中的最后一个项目)。 您不能使用等效的高阶函数,并且创建的每个函数 都不能使原始列表发生变异 给您三个或四个参数。

  1. 一个列表
  2. 函数名称作为字符串
  3. 函数需要的一个参数,如果需要则为四个索引(用于插入)
  4. 一个项目(仅用于插入)

好的祝你好运!

要知道,这些功能并不是实现此目的的最佳方法。 使用关联的高阶函数要快得多。 另外,知道高阶函数都返回Nonepop会返回弹出的内容。

appendextend :这只是Python的精妙之处。 将列表添加到另一个列表会自动合并两个列表。 li.append(item)li.extend(other_li)是正确的语法,但是这两个选项会li.extend(other_li)原始列表,而上面编写的选项则不会。 other_liextend不突变虽然。

在这种情况下, insertpop都使用切片。 我将重点介绍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) :请注意,这两个不是关键字或参数的参数都在这两个调用之间,这是必需的。

但是真正奇怪的部分是,为什么在每次函数调用期间lidic不断发生突变? 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__()并且所有先前的值都已被垃圾回收。

所有代码都放在一个地方:

和代表:

这是Guido,Python外星人

需要注意的其他事项:

  1. 文件名,变量名和函数名用下划线命名。
  2. 缩进:4个空格是惯例。
  3. CamelCase很少使用,仅在类中使用。
  4. 如果变量是globalthenitisall小写(如果变量是global,则全部为小写)。
谢谢阅读。 任何与本文有关的建议,想法,评论,想法,掌声或您想做的其他事情,将不胜感激!

From: https://hackernoon.com/https-medium-com-muzsik33-a-space-adventure-introducing-python-7cde79b53219

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值