“python 是您仍然可以阅读的最强大的语言.-保罗·杜布瓦
作为一名开发人员, 很难只专注于一种编程语言, 在您的职业生涯中, 至少有几个项目需要您至少了解一点与您所擅长的编程语言不同的编程语言。在这种情况下, 您开始比较它们, 注意它们的特殊性, 并且经常尝试以您最喜欢的语言中习惯的相同方式编写代码。
很快你就会失望, 因为这种新语言不支持你所期望的一些功能。在几百行代码之后, 您开始注意到这种语言实际上可以满足您的要求, 您开始了解它的工作方式, 也许还有作者这样构建它的原因。这就是作为一个开发者的挑战和美, 你永远不知道在你的下一个项目中你会 “说” 什么语言。
在本文中, 我将继续探索 python , 并与您分享我在从事一个项目时发现的好奇心。
返回多个结果的方法
有时, 我希望有一个方法, 将返回多个结果。我可以尝试将事情分组到一个逻辑结构中, 但并不总是如此。您可能认为, 此方法自动违反了具有执行单个操作的方法的规则, 因为返回的两个结果意味着在该方法内执行两个进程。
假设我们想要一个方法, 将两个数字, 并返回商和余数:
def divide(a, b):
quotient = a // b
remainder = a % b
return quotient, remainder
调用此方法并将结果分配给某些变量可以通过以下方式完成:
quotient, remainder = divide(6, 2)
此方法的结果通过保留 < cn/语句中的顺序分配给变量。下面是输出的示例:
Experiment 1: 6 / 2
Quotient = 3
Remainder = 0
Experiment 2: 5 / 2
Quotient = 2
Remainder = 1
不过, 在引擎盖下, 此方法仍然返回一个值, 但此值是元组。具有多个逗号分隔值的 < c\/> 语句, 假定这些值内部转换为元组, 反之亦然, 称为打包和解包元组。
图1拆包元组
元组是一个值序列, 与列表非常相似。元组中存储的值可以是任何类型, 并且它们由整数编制索引。列表和元组之间的重要区别在于, 后者是不可变的。你可以在这里找到更多关于元组的信息, 这是一个相当好的资源。
交换2个变量
进一步探讨 python 中的元组, 让我们看看如何交换两个变量, a和b。您可能会想到的第一件事是使用第三个变量, 如下面的示例所示:
temp = a
a = b
b = temp
如果我们认为这两个变量是一些数字, 有人可能会使用数学来进行交换:
a = a + b x = x * y x = x ^ y
b = a - b or y = x / y or y = x ^ y
a = a - b x = x / y x = x ^ y
当然, 到目前为止, 你所看到的每一种方法都有它的优点和缺点, 但我们现在不会去研究这个问题
python 中的常量
有几次, 当我想在 python 中创建一些常量, 但我很快意识到, 我不能用简单而安全的方式来做, 因为没有可用的最终或 const 关键字。建议遵循常量的命名约定, 并尽量不要更改该变量:
- 声明常量时必须使用大写字母。例如: pi = 3.14。
- 常量必须放在 python 模块中, 并不意味着要更改。
- 常量名称可以有大写 (a 到 z) 或数字 (0 到 9) 或下划线 (_) 的字母组合。例如: const _ name。
但是, 如果确实有必要确保常量的值永远不会更改, 则有几种方法可以实现它:
备选案文 1.在模块级别将常量包裹在函数内:
def PI():
return 3.14
备选案文 2.如果常量是某些特定类的一部分, 则声明没有 setter 的属性:
@property
def pi(self):
return 3.14
备选案文 3.使用命名元组。请记住, 我之前说过, 元组是不可变的, 只要您定义了一个值, 它就不能再更改:
from collections import namedtuple
Color = namedtuple('Color','BLUE YELLOW RED')
Color = Color(BLUE = '#0000FF', YELLOW = '#FFFF00', RED = '#FF0000')
print(Color.BLUE) # #0000FF
备选案文 4.使用Metaclasses。它们用于定义类的行为方式。
class MetaConst(type):
def __getattr__(cls, key):
return cls[key]
def __setattr__(cls, key, value):
raise TypeError
有了上面的定义, 任何静态属性都将是不可变的, 因为我们定义了一个有效的 getter, 而 setter 将引发异常。
现在我们有了一个元类, 我们可以创建一个类, 它将表示我们的常量的包装:
class Const(object, metaclass=MetaConst):
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
raise TypeError
可以通过以下方式为一组常量创建包装:
class Color(Const):
BLUE = '#0000FF'
YELLOW = '#FFFF00'
RED = '#FF0000'
print(Color.BLUE) # #0000FF
添加或删除常量就像在包装内声明新变量一样简单。
流量控制
说到如果, 在, 或任何其他控制结构, python 绝对是一个赢家, 必须写的行的数量。python 是一种使用缩进将代码分成块的编程语言, 而 java 或 javascript 和大多数其他语言则使用大括号来定义函数或类定义的开头和结尾。
让我们看看一个基于你一生中最可能玩过一次的游戏的例子–岩石–纸–剪刀。
java 代码:
public void play() {
Scanner sc = new Scanner(System.in);
System.out.print("Rock, Paper or Scissors?");
String userInput = sc.next().toLowerCase();
if ("paper".equals(userInput)) {
paper();
}
else if ("rock".equals(userInput)) {
rock();
}
else if ("scissors".equals(userInput)) {
scissors();
}
else {
System.out.println("Invalid choice!");
play();
}
}
python 代码:
def play():
user_input = str(input("Rock, Paper or Scissors?"))
当你看它的时候, 你清楚地看到了它的意图, 可以在不被句法元素干扰的情况下识别范围。
实际上, 控制流周围没有括号的事实可以被认为是一种优势, 因为缩进迫使您以易于阅读的方式将程序设置出来, 从而减少了由于缺少大括号而导致错误的可能性。可理解的代码更易于维护, 并且不太可能包含 bug。
另一方面, 如果缩进级别太多, 任何语言都很难阅读, 但这是程序 (和开发人员) 的问题, 而不是语言的问题。一个太长的例程被分解成更小的碎片是可取的。
python 很容易学习, 也很有趣, 尽管您应该记住它是一种脚本语言, 构建企业应用程序可能是一个很大的挑战。像 python 这样的弱类型语言无法捕捉到所有的拼写错误, 这可能会在运行时造成严重损害, 但是, 这并不妨碍 google、facebook、instagram、youtube、spotify 或 netflix 使用 python 进行数据分析、后端服务和基础设施管理。主要原因是 python 的简单性和实用性、易于部署以及维护起来有多简单。