私信  •  关注

Blckknght

Blckknght 最近创建的主题
Blckknght 最近回复了
3 年前
回复了 Blckknght 创建的主题 » 最具python风格的方式是使用function获取用户输入

如果你被分配到 num1 num2 仅在函数中,您不再需要将它们作为参数传递。实际上,您不能将它们作为参数传递,因为函数外部的代码不知道为它们输入了什么值。这就是为什么你会得到一个例外,名字 num1 num2 它们是不受约束的。

只需删除这些参数:

def add():                    # get rid of parameters here
    num1=int(input('num1: '))
    num2=int(input('num2: '))
    return num1+num2
add()                         # and don't try to pass any arguments

至于首选的是什么,可能您希望在示例1上进行一些修改。如果希望函数收集用户输入, 让它成为一个单独的功能 .用户输入收集功能可以调用 add 函数的值,就像您的全局代码一样,不会污染全局名称空间。

def add(num1,num2):            # this is unchanged from the early examples
    return num1+num2

def do_stuff():                # put the user input in another function
    num1=int(input('num1: '))
    num2=int(input('num2: '))
    print(add(num1,num2))      # or return here, or do whatever makes sense
3 年前
回复了 Blckknght 创建的主题 » 在本地安装python包并不总是有效的

当你把这些库放进你的 lib 文件夹并按您的方式导入它们,您正在更改它们的包名。不再是了 colorama 顶级套餐,现在 lib.colorama .有些库可能对此没有问题,但对于其他库,它们希望能够使用正常名称导入自己的代码。如果 colorama.some_submodule 试图 import colorama ,它会失败。

重要的是要意识到 from lib import colorama 不会改变你的生活方式 科洛拉玛 随处可见。它只会更改本地名称空间。包裹还在 lib。科洛拉玛 ,我们刚把它和名字绑在一起 科洛拉玛 在当前模块中。

正如JonSG在评论中所建议的,更好的解决方案是 解放党 将文件夹放入Python搜索路径中,以便 进口色拉马 将找到具有正常名称的包。修改 sys.path 这是一种方法,另一种是 PYTHONPATH 环境变量(可能不适合当前问题,但有时在其他情况下有用)。

3 年前
回复了 Blckknght 创建的主题 » Python-计算从object1(x和y)到object2(x和y)的角度

这是应用程序的经典用例 math.atan2 功能:

from math import atan2, degrees

def AngleFromObject1ToObject2InDegrees(object1, object2):
    return degrees(atan2(object2.y - object1.y, object2.x - object1.x))

请注意,这使用了沿正x轴(向右)从零开始并逆时针增加的角度的数学约定。如果你愿意 0 要使它们上升并顺时针增加(如磁罗盘刻度盘上的轴承),可以将参数转换为 atan2 你也可以考虑把你的角度放在弧度上,这样就方便多了(因为其他三角函数都是弧度的)。

3 年前
回复了 Blckknght 创建的主题 » 在Python中,如何使用方法参数作为新对象的名称?

可以 做你想做的,但这是一个非常糟糕的主意。

首先,让我们解释一下怎么做。你会想使用 globals() builtin,它会向您返回一个字典,其中包含当前模块中定义的所有全局变量。如果编辑字典,全局变量将被更改。在您的情况下,您希望添加 Stock 对象作为由 ticker 名称这看起来像:

def buyStock(self, ticker, price, amount):
    #Add stock to portfolio
    self.stockPortfolio.append(ticker)
    globals()[ticker] = Stock(ticker, price, amount)  # make a global variable

现在你知道了 怎样 要做到这一点,以下是您可能不应该这么做的原因。像这样使用全局名称空间的问题是,您不能(轻松地)编写期望给定股票代码变量存在的代码。像你这样的台词 print(AMZN.amount) 如果你买了另一只股票就会失败。同样,如果你再购买一批亚马逊股票,你会覆盖 AMZN 使用新的 股票 对象,并且将无法了解您第一次购买的金额,以及您为此支付的价格。

更好的办法是将股票对象放入数据结构中,比如投资组合中已有的列表。这样你就不需要为它使用特定的名称,如果需要的话,你可以用相同的名称购买多个股票。我会用这样的方式:

def buyStock(self, ticker, price, amount):
    #Add stock to portfolio
    self.stockPortfolio.append(Stock(ticker, price, amount))

你可以用打印机打印最近购买的金额 print(p.stockPortfolio[-1].amount) ,或者写一个循环,打印出所有股票(可能还有它们的数量或价值),而不是总是得到第一个。

5 年前
回复了 Blckknght 创建的主题 » Python 2 while循环在第二次迭代中失败

您似乎正在覆盖 rmsd 函数的返回值。在循环中使用其他变量名,则不会出现此问题:

while True:
    # ...

    rmsd_value = rmsd(...)   # don't do rmsd = ... here, or you overwrite the function!

    # ...
5 年前
回复了 Blckknght 创建的主题 » 在python中用父类方法重写init

从调用中获取的代理对象 super 只是用来定位 with_two_legs 要调用的方法(因为您没有在 Human ,你可以用 self.with_two_legs 同样的结果)。

作为 wim 评论道,你的替代构造函数 有两条腿 不起作用,因为 班级休息 Liskov substitution principle 通过使用不同的构造函数签名。即使你能让代码调用 Animal 为了构建你的实例,你会遇到问题,因为你最终会得到一个 动物 实例而不是 一个(所以其他方法 ,如果您写了一些,将无法使用)。

注意,这种情况并不少见,许多Python子类的构造函数签名与其父类不同。但这确实意味着不能像使用 classmethod 试图构造实例的。你需要避免这些情况。

在这种情况下,最好使用 legs 对…的争论 动物 构造器。它可以默认为 2 如果没有通过替代编号,则为支腿。那你就不需要 类方法 ,并且在重写时不会遇到问题 __init__ :

class Animal:
    def __init__(self, name, legs=2): # legs is now optional, defaults to 2
        self.legs = legs
        print(name)

class Human(Animal):
    def __init__(self):
        super().__init__('Human')

john = Human()
6 年前
回复了 Blckknght 创建的主题 » 需要帮助理解python的递归

您当前的代码正在返回解决方案的数目。在这两个基本情况之后,有两个递归调用。在第一个递归调用中,我们检查存在多少个解决方案。 X 不包括 current**N . 第二个递归检查如果我们存在多少解 包括 当前**N .

如果要返回实际的解决方案本身(作为元组列表),则需要稍微更改代码。

从基本情况开始。如果 pw > X ,没有解决方案 current 这么大,所以我们应该返回一个空列表。如果 pw == X ,然后我们找到了一个解决方案,应该返回一个单元素列表,其中包含单元素元组 (current,) (注意后面的逗号,这是使括号形成元组所必需的,而不仅仅是为了操作顺序)。

递归的情况也需要更复杂一些。两个调用都将返回列表,我们希望合并这些列表。对于第一个递归,我们可以按原样使用返回的列表。对于第二个,我们需要添加 现在的 值到每个元组的开头。我建议使用一个生成器表达式(如果您想将列表与 + 而不是使用 list.extend ).

def powerSum(X, N, current = 1):
    pw = pow(current, N)
    if pw > X:
        return []
    elif pw == X:
        return [(current,)]
    else:
        result = powerSum(X, N, current+1)
        result.extend((current,) + tup for tup in powerSum(X-pw, N, current+1))
        return result