相关疑难解决方法(0)

Python中函数的默认值

我注意到以下几点:

class c:
  def __init__(self, data=[]):
    self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]
Run Code Online (Sandbox Code Playgroud)

这是正确的行为吗?

python default-value

9
推荐指数
1
解决办法
2890
查看次数

如何设置变量的默认值?

想象一下我在javascript中有以下代码

function test(string) {
    var string = string || 'defaultValue'
}
Run Code Online (Sandbox Code Playgroud)

启动可能未定义的变量的python 方法是什么?

javascript python undefined

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

简单函数返回每次调用时递增1的数字,没有全局变量?

我正在尝试编写一个python函数,在第一次调用时,返回1.在第二次调用时,返回2.在第三个,一个3.等等.

目前,我使用全局变量实现了这一目标:

index = 0

def foo():
    global index
    index += 1
    return index
Run Code Online (Sandbox Code Playgroud)

调用该函数三次时:

print(foo())
print(foo())
print(foo())
Run Code Online (Sandbox Code Playgroud)

它返回预期的值:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但是,我已经读过使用全局变量是不好的做法.所以,我想知道如果不使用全局变量可以实现相同的结果.

有什么建议吗?

谢谢您的帮助.

python increment

8
推荐指数
2
解决办法
746
查看次数

如何获得有关列表是可变默认参数的警告?

我在不知情的情况下不小心使用了可变的默认参数

有没有可以发现这一点并警告我的 linter 或工具?

python static-analysis

8
推荐指数
1
解决办法
1159
查看次数

Python风格:if语句与布尔评估

Python设计理念的一个想法是"应该有一个......明显的方法来实现它".(PEP 20),但这并非总是如此.我特别指的是(简单)if语句与布尔评估.考虑以下:

if words:
    self.words = words
else:
    self.words = {}
Run Code Online (Sandbox Code Playgroud)

self.words = words or {}
Run Code Online (Sandbox Code Playgroud)

在这样一个简单的情况下,从风格上说,这是更可取的吗?对于更复杂的情况,可以选择if语句以获得可读性,对吧?

python if-statement coding-style

7
推荐指数
1
解决办法
1818
查看次数

函数参数中空列表的值,此处示例

可能重复:
Python中的"最小惊讶":可变默认参数

def f(a, L=[]):
    L.append(a)
    return L

print(f(1, [1, 2]))
print(f(1))
print(f(2))
print(f(3))
Run Code Online (Sandbox Code Playgroud)

我想知道为什么其他f(1),f(2),f(3)没有附加到第一个f(1,[1,2]).我想结果应该是:

[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

但结果不是这个.我不知道为什么.

python parameters function

7
推荐指数
1
解决办法
8634
查看次数

使用datetime的python默认参数值

我有一个简单的Python脚本,它使用Ctl-C的信号处理程序.如果程序正常完成,则结束时间将传递到"print_results"函数中.我希望print_results函数有一个可选参数,如果没有传递,只需获取当前"现在"时间.但是当我从信号处理程序调用它时,它没有得到正确的时间.

这是我简化但可重复的程序:

import sys
import signal
import urllib2
import urllib
import datetime
import time
import getopt,sys

def signal_handler(signal, frame):
    print_results()
    sys.exit(0)

def print_results(ended=datetime.datetime.now()):
    print "\nEnded at ",ended
    print "Total time: ",(ended - startTime)
    print "Finished ",numIterations," iterations, received ",totalRecords," records"

    numIterations = 0
    maxIterations = 8
    delaySecs = 3
    totalRecords = 0

    # set up signal handler
    signal.signal(signal.SIGINT, signal_handler)

    startTime = datetime.datetime.now()

    print "Starting at ",time.asctime(time.localtime())

    while (numIterations < maxIterations):

        iterStartTime = datetime.datetime.now()

        numIterations += 1

        print "Iteration: ",numIterations

        # …
Run Code Online (Sandbox Code Playgroud)

python datetime

7
推荐指数
1
解决办法
9977
查看次数

Python字符串插值实现

[编辑00]:我已经多次编辑该帖子,现在甚至是标题,请阅读以下内容.

我只是了解了格式字符串的方法,其使用词典使用,如所提供的那些vars(),locals()globals(),例如:

name = 'Ismael'
print 'My name is {name}.'.format(**vars())
Run Code Online (Sandbox Code Playgroud)

但是我想这样做:

name = 'Ismael'
print 'My name is {name}.' # Similar to ruby
Run Code Online (Sandbox Code Playgroud)

所以我想出了这个:

def mprint(string='', dictionary=globals()):
    print string.format(**dictionary)
Run Code Online (Sandbox Code Playgroud)

您可以在此处与代码进行交互:http://labs.codecademy.com/BA0B/3#: workspace

最后,我想做的是将该函数放在另一个名为的文件中my_print.py,这样我就能做到:

from my_print import mprint

name= 'Ismael'
mprint('Hello! My name is {name}.')
Run Code Online (Sandbox Code Playgroud)

但就像现在一样,范围存在问题,我如何从导入的mprint函数中将主模块命名空间作为字典.(不是那个my_print.py)

我希望我自己理解,如果没有,尝试从另一个模块导入该功能.(回溯在链接中)

它正在访问globals()dict my_print.py,但当然变量名在该范围内没有定义,有关如何实现这一点的任何想法?

如果它在同一模块中定义,该函数可以工作,但请注意我必须如何使用,globals()因为如果不是,我只会得到一个mprint()范围内的值的字典.

我已经尝试使用非局部和点符号来访问主模块变量,但我仍然无法弄明白.


[编辑01]:我想我找到了一个解决方案:

在my_print.py中:

def mprint(string='',dictionary=None):
    if dictionary is None:
        import sys …
Run Code Online (Sandbox Code Playgroud)

python string-interpolation

7
推荐指数
1
解决办法
1631
查看次数

如何使用 `__slots__` 初始化属性?

我通读了有关插槽使用的主要答案,它让我了解了如何以及在何处使用__slots__.

现在,我将代码从 Python 2 移植到 Python 3,类似于以下内容:

class B(object):
    __slots__ = ('_fields')
    _fields = set()
Run Code Online (Sandbox Code Playgroud)

但这会在 Python 2 上正常工作时给出错误 Python 3:

ValueError: '_fields' in __slots__ conflicts with class variable.

我将代码更改为

class B(object):
    __slots__ = ('_fields')
    def __init__(self):
        _fields = set()
Run Code Online (Sandbox Code Playgroud)

它工作正常。我的疑问是,它甚至是正确的更改吗?

正如我从原始代码中得到的,我猜它是说不要__dict__用于节省内存或更快的访问或任何原因,但同时也试图将属性类型指定_field为 set()。上面的更改是否是正确的表达方式,或者它可能会产生一些副作用。


进一步实验:我进一步实验了以下变体(在 Python 3 上):

import pdb

class A(object):
    a = set()

'''
class B(object):
    __slots__ = ('a')
    a = set()
'''

class C(object):
    __slots__ = ('a')
    def …
Run Code Online (Sandbox Code Playgroud)

python initialization slots

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

list.clear()与list = []有什么不同?

函数的预期目标foo是将作为参数提供的数字添加到列表中,如果它为0,则重置列表.首先我写了这个程序:

def foo(n, bar = []):
    if n == 0:
        bar = []
        print("list empty")
    else:
        bar.append(n)
        for y in bar:
            print(y, end=', ')
        print()

foo(5)
foo(3)
foo(0)
foo(6)
Run Code Online (Sandbox Code Playgroud)

输出:

5, 
5, 3, 
list empty
5, 3, 6, 
Run Code Online (Sandbox Code Playgroud)

但它看起来像bar = []被忽略了.然后我改变bar = []bar.clear(),它按照我的想法运作:

def foo(n, bar = []):
    if n == 0:
        bar.clear()
        print("list empty")
    else:
        bar.append(n)
        for y in bar:
            print(y, end=', ')
        print()

foo(5)
foo(3)
foo(0)
foo(6)
Run Code Online (Sandbox Code Playgroud)

输出:

5, 
5, …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

7
推荐指数
1
解决办法
159
查看次数