小编Jim*_*ard的帖子

如何在python 3.6中使用类型提示?

我注意到python 3.5和python 3.6增加了很多关于静态类型检查的功能,所以我尝试使用以下代码(在python 3.6中,稳定版本).

from typing import List

a: List[str] = []
a.append('a')
a.append(1)
print(a)
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是,python没有给我一个错误或警告,虽然1附加到一个list只应该包含字符串.Pycharm检测到类型错误并给我一个警告,但它并不明显,它没有在输出控制台中显示,我害怕有时我可能会错过它.我想要以下效果:

  1. 如果我显然使用了如上所示的错误类型,则抛出警告或错误.
  2. 如果编译器无法可靠地检查我使用的类型是对还是错,请忽略它.

那可能吗?也许mypy可以做到,但我更喜欢使用python-3.6-style类型检查(比如a: List[str])而不是使用的注释风格(如# type List[str])mypy.而且我很好奇是否在本机python 3.6中有一个切换来实现我上面提到的两点.

python type-hinting python-3.x python-3.6 mypy

40
推荐指数
3
解决办法
1万
查看次数

python3.<x>和python3之间有什么区别.<x> m

  • m代表什么python3.6m
  • 它与非m版本有何不同?
  • 在哪种情况下,我更愿意使用python3.6m而不是python3.6

python python-3.x python-3.6

40
推荐指数
1
解决办法
1万
查看次数

为什么repr(int)比str(int)更快?

我想知道为什么repr(int)比快str(int).使用以下代码段:

ROUNDS = 10000

def concat_strings_str():
    return ''.join(map(str, range(ROUNDS)))

def concat_strings_repr():
    return ''.join(map(repr, range(ROUNDS)))

%timeit concat_strings_str()
%timeit concat_strings_repr()
Run Code Online (Sandbox Code Playgroud)

我得到了这些时间(python 3.5.2,但与2.7.12的结果非常相似):

 1.9 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
 1.38 ms ± 9.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)

如果我走在正确的道路上,同样的功能long_to_decimal_string就会在引擎盖下面调用.

我错了什么或者我还缺少什么?


更新:这可能没有什么用int__repr____str__方法,但之间的差异repr()str(),如int.__str__和 …

python performance python-internals

34
推荐指数
3
解决办法
2397
查看次数

输入()函数的输入有多大?

我为该input()功能提供的输入有多大?

不幸的是,没有简单的方法来测试它.在使用了大量的复制粘贴之后,我input无法在我提供的任何输入上失败.(我最终放弃了)

文档input功能,并没有提及关于这样的东西:

如果prompt参数存在,则将其写入标准输出而不带尾随换行符.然后,该函数从输入中读取一行,将其转换为字符串(剥离尾部换行符),然后返回该行.读取EOF时,EOFError会引发.

那么,我猜是没有限制的?有没有人知道是否有,如果有,多少钱?

python string function python-3.x python-internals

33
推荐指数
2
解决办法
2768
查看次数

为什么str.strip()比str.strip('')快得多?

可以通过两种方式分割白色空间str.strip.您可以发出不带参数的调用str.strip(),默认情况下使用空格分隔符或自己显式提供参数str.strip(' ').

但是,为什么在定时时这些功能的表现如此不同?

使用具有有意量的空格的示例字符串:

s = " " * 100 + 'a' + " " * 100
Run Code Online (Sandbox Code Playgroud)

时间s.strip()和时间s.strip(' ')分别为:

%timeit s.strip()
The slowest run took 32.74 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 396 ns per loop

%timeit s.strip(' ')
100000 loops, best of 3: 4.5 µs per loop
Run Code Online (Sandbox Code Playgroud)

strip需要396nsstrip(' ')采用4.5 …

python string performance python-3.x python-internals

31
推荐指数
2
解决办法
2634
查看次数

是否有任何理由给自己一个默认值?

我正在浏览一些代码,我注意到一条引起我注意的线.代码类似于下面的示例

class MyClass:
    def __init__(self):
        pass

    def call_me(self=''):
        print(self)
Run Code Online (Sandbox Code Playgroud)

这看起来像我见过的任何其他类,但是str作为默认值传入的是self.

如果我打印出来self,它就像正常一样

>>> MyClass().call_me()
<__main__.MyClass object at 0x000002A12E7CA908>
Run Code Online (Sandbox Code Playgroud)

这一直困扰着我,我无法弄清楚为什么会这样.是否有任何理由将str实例作为默认值传入self?

python class python-3.x

31
推荐指数
2
解决办法
1031
查看次数

了解Python中大整数的内存分配

Python如何为大整数分配内存?

一个int类型的大小28 bytes和随着我不断增加的值int,大小以增量为单位增加4 bytes.

  1. 为什么28 bytes最初的价值低至何1

  2. 为什么增量4 bytes

PS:我在x86_64(64位机器)上运行Python 3.5.2.关于(3.0+)解释器如何处理如此庞大的数字的任何指针/资源/ PEP都是我正在寻找的.

代码说明尺寸:

>>> a=1
>>> print(a.__sizeof__())
28
>>> a=1024
>>> print(a.__sizeof__())
28
>>> a=1024*1024*1024
>>> print(a.__sizeof__())
32
>>> a=1024*1024*1024*1024
>>> print(a.__sizeof__())
32
>>> a=1024*1024*1024*1024*1024*1024
>>> a
1152921504606846976
>>> print(a.__sizeof__())
36
Run Code Online (Sandbox Code Playgroud)

python int python-3.x python-internals

31
推荐指数
2
解决办法
2834
查看次数

如何解释Python 3.6中的str.maketrans函数?

我目前正在参加Udacity课程,该课程指导学生使用Python进行编程.其中一个项目让学生重命名目录中的照片文件(删除名称中的任何数字),以便按字母顺序排列文件,之后将拼写出一条秘密信息.例如,如果文件名是"48athens",则程序试图删除数字,仅保留"athens"为文件名.

我使用的是Python 3.6,而课程讲师使用的是Python 2.7.我应该使用Python 2.7来简化学习过程.但是,现在我将继续使用Python 3.6.

教师重命名文件的方式是使用.translate函数,它在Python 2.x中使用两个参数,而Python 3.x只使用一个参数.它从文件名中删除任何数字(0到9).

import os

def rename_files(): #Obtain the file names from a folder.
    file_list = os.listdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank")
    print (file_list)
    saved_path = os.getcwd()
    os.chdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank")
    for file_name in file_list: #Rename the files inside of the folder.
        os.rename(file_name, file_name.translate(None, "0123456789"))
    os.chdir(saved_path)

rename_files()
Run Code Online (Sandbox Code Playgroud)

但是,这在Python 3.x中不起作用,因为它说:

TypeError: translate() takes exactly one argument (2 given)
Run Code Online (Sandbox Code Playgroud)

谢天谢地,我找到了另一种使用某人帮助的方法.但是,我不确定它是如何工作的.有人可以str.maketrans向我解释这个功能,引号中的前两个空白参数是什么?我的想法是它说:对于文件名中的前两个字符,删除任何数字(0到9).那是对的吗?例如,"48athens"如果它们是0到9之间的数字,则删除前两个字符(4和8).

import os

def rename_files(): #Obtain the file names from a folder.
    file_list = os.listdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank") …
Run Code Online (Sandbox Code Playgroud)

python string python-3.x

31
推荐指数
2
解决办法
3万
查看次数

元素方式元组添加

我在元组中有一些值,我希望在元素方面添加另一个元组.所以我想要这样的功能:

std::tuple<int,int> a = {1,2};
std::tuple<int,int> b = {2,4};


std::tuple<int,int> c = a + b; // possible syntax 1
a += b; // possible syntax 2
a += {2,4}; // possible syntax 3
Run Code Online (Sandbox Code Playgroud)

输出元组将具有该值的位置 {3,6}

正在看CPP参考,但我找不到这个功能.这个这个问题可能是相关的,但是其他复杂性会使答案变得模糊不清.

c++ tuples

30
推荐指数
3
解决办法
1739
查看次数

转换为字符串会引发错误吗?

我想知道是否转换为字符串即str(sth)可以引发异常,例如float(sth)吗?我要求知道是否有必要将我的代码包装在:

try:
    x = str(value)
except ValueError:
    x = None
Run Code Online (Sandbox Code Playgroud)

确保执行不会因转换失败而停止.

这在Python 2和3中也有所不同,因为它们的str类不同吗?

python string casting python-3.x

29
推荐指数
4
解决办法
2931
查看次数