【问题标题】:how to declare variable type, C style in python如何在python中声明变量类型,C风格
【发布时间】:2011-04-25 09:28:33
【问题描述】:

我是一名编程学生,我的老师从 C 开始教我们编程范式,他说如果我用 python 交付我的作业就可以了(作业更容易更快)。而且我希望我的代码尽可能接近纯 C。
问题是:
如何像在 C 中一样在 python 中声明变量的数据类型。例如:

int X,Y,Z;

我知道我可以在 python 中做到这一点:

x = 0
y = 0
z = 0

但这似乎需要做很多工作,并且忽略了 python 比 C 更容易/更快的意义。 那么,最短的方法是什么?
附言我知道大多数时候你不必必须在 python 中声明数据类型,但我仍然想这样做,这样我的代码看起来尽可能像同学的。

【问题讨论】:

  • 您不太了解 Python 中的变量。把它想象成 C void* 指针:它们没有固有类型,它们是用来指代任何东西的名称。在 Python 中,对象存在于解释器的内存丛林中,您可以给它们命名并记住在哪里可以使用变量找到它们。您的变量没有 C 意义上的类型,它只是指向一个对象。

标签: python c variables


【解决方案1】:

从 Python 3.6 开始,您可以声明变量和函数的类型,如下所示:

explicit_number: type

或者对于一个函数

def function(explicit_number: type) -> type:
    pass

这篇文章中的这个例子:How to Use Static Type Checking in Python 3.6 更明确

from typing import Dict

def get_first_name(full_name: str) -> str:
    return full_name.split(" ")[0]

fallback_name: Dict[str, str] = {
    "first_name": "UserFirstName",
    "last_name": "UserLastName"
}

raw_name: str = input("Please enter your name: ")
first_name: str = get_first_name(raw_name)

# If the user didn't type anything in, use the fallback name
if not first_name:
    first_name = get_first_name(fallback_name)

print(f"Hi, {first_name}!")

docs for the typing module

【讨论】:

  • 终于正确回答了这个问题......但即使这样也无法避免为 vars 分配不兼容的值。只有像 pycharm 这样的 IDE 才能使用这些信息来查找可能的错误...
  • @wmac 这只是对开发人员的类型提示。事实上,智能 IDE 可以解析这个并警告你不匹配,但这是他们能做的最多的事情。鉴于 Python 的动态特性,这是可以接受的行为。
  • 感谢您提供的信息/提示,仅供参考
  • 所以在java中,例如当一个变量类型被定义时,它不允许分配一个不兼容的类型。但是python仍然可以。那么它真的有帮助吗?
  • @wmac 如果您需要验证数据对象,您可以使用数据类docs.python.org/3/library/dataclasses.html 进行验证,但是由于 python 的鸭子类型,变量是动态的,因此解释器不会检查静态类型,但它有助于记录和开发了解变量是什么。
【解决方案2】:

编辑:Python 3.5 引入了type hints,它引入了一种指定变量类型的方法。此答案是在此功能可用之前编写的。

没有办法在 Python 中声明变量,因为 C 意义上的“声明”和“变量”都不存在。这会将三个名称绑定到同一个对象:

x = y = z = 0

【讨论】:

  • 这在 Python 3.5 中已经过时了,它允许静态类型。请参阅 Cam Ts 答案。
【解决方案3】:

Python 不一定比 C 更容易/更快,尽管它可能更简单;)

为了澄清您所做的另一个陈述,“您不必声明数据类型” - 应该重申您不能声明数据类型。当你给一个变量赋值时,值的类型就变成了变量的类型。这是一个微妙的区别,但仍然不同。

【讨论】:

  • 我会说C比python简单。它缺少装饰器、元类、描述符等。当然,这些都可以用 C 来实现,但复杂的是你的程序,而不是底层语言。
  • @aaron - 注意我说可能 :) 我已经用 C 语言做了超过 25 年,而 Python 只用了一年——我仍然用 C 语言编写我所有的小东西(但不是因为它很简单)
  • 语言在功能方面可能更简单。但关键是实现装饰器、元类、描述符等并不简单
  • C 是一种相当简单的语言。这绝对不意味着用 C 编写代码很简单。 :)
  • 现在,您可以使用type hinting 来声明数据类型,但它不会在运行时使用。
【解决方案4】:

我很惊讶没有人指出你实际上可以这样做:

decimalTwenty = float(20)

在很多情况下,键入变量是没有意义的,因为它可以随时重新键入。但是在上面的示例中,它可能很有用。还有类似这样的其他类型函数,例如:int()long()float()complex()

【讨论】:

  • 我很惊讶你这么说。因为这不会使您的变量类型化,并且与分配 20.0 的值没有什么不同......它们都不会使您的变量始终浮动。您仍然可以为该变量分配任何值。
  • 如果您使用 type hinting 并尝试将不同类型的值分配给已具有 mypy 类型的变量,则会引发错误 Incompatible types in assignment
【解决方案5】:

简单地说:在 python 中键入仅对提示有用。

x: int = 0
y: int = 0 
z: int = 0

【讨论】:

    【解决方案6】:

    但是强类型和变量定义实际上是为了让开发更容易。如果您没有提前考虑这些事情,那么您就不是在设计和开发代码,而只是在进行黑客攻击。

    松散类型只是将复杂性从“设计/破解”时间转移到运行时间。

    【讨论】:

      【解决方案7】:

      Python 中的一切都是对象,包括类、类实例、函数中的代码、称为模块的函数库,以及整数、浮点数、字符串等数据值或列表和字典等容器。它甚至包括命名空间,这些命名空间是类字典(或映射)容器,用于跟踪标识符名称(字符串对象)与当前存在的对象之间的关联。如果两个或多个标识符与同一个对象相关联,则一个对象甚至可以有多个名称。

      将标识符与对象相关联称为“将名称绑定到对象”。这是最接近 Python 中的变量声明的东西。名称可以在不同的时间与不同的对象相关联,因此声明您要将其附加到哪种类型的数据是没有意义的——您只需执行此操作即可。它通常在一行或代码块中完成,指定名称和对象值的定义导致它被创建,例如<variable> = 0 或以def <funcname> 开头的函数。

      这有什么帮助。

      【讨论】:

        【解决方案8】:

        我在 python 2 和 3 中使用数据类型来断言唯一值。否则我不能让它们像 str 或 int 类型一样工作。但是,如果您需要检查一个可以具有任何类型的值除了特定类型,那么它们非常有用并且可以使代码更好地阅读。

        继承对象会在 python 中创建一个类型。

        class unset(object):
            pass
        >>> print type(unset)
        <type 'type'>
        

        示例使用:您可能希望使用条件或函数处理程序有条件地过滤或打印值,因此使用类型作为默认值会很有用。

        from __future__ import print_function # make python2/3 compatible
        class unset(object):
            pass
        
        
        def some_func(a,b, show_if=unset):
            result = a + b
            
            ## just return it
            if show_if is unset:
                return result
            
            ## handle show_if to conditionally output something
            if hasattr(show_if,'__call__'):
                if show_if(result):
                    print( "show_if %s = %s" % ( show_if.__name__ , result ))
            elif show_if:
                print(show_if, " condition met ", result)
                
            return result
            
        print("Are > 5)")
        for i in range(10):
            result = some_func(i,2, show_if= i>5 )
            
        def is_even(val):
            return not val % 2
        
        
        print("Are even")
        for i in range(10):
            result = some_func(i,2, show_if= is_even )
        

        输出

        Are > 5)
        True  condition met  8
        True  condition met  9
        True  condition met  10
        True  condition met  11
        Are even
        show_if is_even = 2
        show_if is_even = 4
        show_if is_even = 6
        show_if is_even = 8
        show_if is_even = 10
        

        如果show_if=unset 是完美的用例,因为它更安全且可读性好。我还在枚举中使用了它们,这在 python 中并不是真正的东西。

        【讨论】:

          猜你喜欢
          • 2010-12-22
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          • 1970-01-01
          • 2010-09-28
          相关资源
          最近更新 更多