我有一个带有一个可选参数的函数,如下所示:
def funA(x, a, b=1):
return a+b*x
Run Code Online (Sandbox Code Playgroud)
我想编写一个调用的新函数,funA并且还有一个可选参数,但是如果没有传递参数,我想保留默认值funA.
我在想这样的事情:
def funB(x, a, b=None):
if b:
return funA(x, a, b)
else:
return funA(x, a)
Run Code Online (Sandbox Code Playgroud)
有更多的pythonic方式吗?
我需要一个字典,它可能对某些键具有相同的名称,并在这种情况下引用键时返回值列表.例如
print mydict['key']
[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud) 什么是Kwarg !! ??
我一直在读django的教程,试图学习这门语言,我偶然发现了这个.
如果有人可以发布/指向一个简单的例子来帮助理解为什么以及如何使用它,我将非常感激.
我见过lambda函数,参数为*x.它是一种放入列表或元组的方式,如果它是一个元组,你如何将列表作为参数参数,反之亦然.
如果你能把我链接到一些文档,我将不胜感激.
有问题的lambda函数:
import os
add_to_place = lambda *x : os.path.abspath(os.path.join(os.path.dirname(__file__), *x))
Run Code Online (Sandbox Code Playgroud)
提前致谢.我推断它是一个元组,但我想要一些文档,只是为了确定.
可能重复:
python*运算符的专有名称?
*拆包当清楚地使用的参数的任意数量和
这是传统的使用*args和**kwargs,我倾向于这些发音为"ARGS"和"quargs",忽略了*秒.
在这个问题中,星号被称为指针.
BDFL如何引用这些符号?
感谢您找到相关问题,这就是我所寻求的.准确地搜索(甚至非常特定的)网络真的很棘手*!
对那些回答他们如何发音"*"的评论员来说,这不是我问的问题(如果我的问题误导了你,我会道歉).我想知道的是这些说明符是如何在Python中命名的,这不是一个主观问题(因此引用了BDFL).
python 中 *args 和 **kwargs 的用法对我来说很清楚,并且 SO 中存在很多问题(例如*args 和 **kwargs 的使用以及**(双星/星号)和 *(星号/星号)对参数做什么?)。
但我想理解的一件事是:为什么不能同时定义强制位置参数、强制 kwarg 参数并最终仍然允许捕获其他参数和 kwargs,如下所示cant_do_that?
def one_kwarg_is_mandatory(*, b, **kwargs):
print(b)
for key, value in kwargs.items():
print(key, value)
def one_pos_arg_and_one_kwarg_are_mandatory(a, *, b, **kwargs):
print(a, b)
for key, value in kwargs.items():
print(key, value)
# I wanted a mandatory arg (a) and possibly parse other args (*args),
# then a mandatory kwarg (b) and eventually other kwargs (**kwargs)
def cant_do_that(a, *args, *, b, **kwargs):
print(a, b) …Run Code Online (Sandbox Code Playgroud) 问题:编写一个__init__直接将集合作为参数而不是解压缩其内容的优缺点是 什么?
上下文:我正在编写一个类来处理数据库表中几个字段的数据.我遍历一些大的(约1亿行)查询结果,一次将一行传递给执行处理的类.每行作为元组从数据库中检索(或者可选地,作为字典).
讨论:假设我对三个字段感兴趣,但传递给我的类的内容取决于查询,查询由用户编写.最基本的方法可能是以下之一:
class Direct:
def __init__(self, names):
self.names = names
class Simple:
def __init__(self, names):
self.name1 = names[0]
self.name2 = names[1]
self.name3 = names[2]
class Unpack:
def __init__(self, names):
self.name1, self.name2, self.name3 = names
Run Code Online (Sandbox Code Playgroud)
以下是可能传递给新实例的行的一些示例:
good = ('Simon', 'Marie', 'Kent') # Exactly what we want
bad1 = ('Simon', 'Marie', 'Kent', '10 Main St') # Extra field(s) behind
bad2 = ('15', 'Simon', 'Marie', 'Kent') # Extra field(s) in front
bad3 = ('Simon', 'Marie') # …Run Code Online (Sandbox Code Playgroud) 我希望有人可以帮助我解决我遇到的问题.我有大量的元组(> 500),如下所示:
(2,1,3,6)
(1,2,5,5)
(3,0,1,6)
(10,1,1,4)
(0,3,3,0)
Run Code Online (Sandbox Code Playgroud)
我的代码片段为:
sum1 = (A,B,C,D) # creates a tuple of sums of (A,B,C,D)
mysum = map(sum, zip(A, B, C, D))
print(mysum)
Run Code Online (Sandbox Code Playgroud)
我意识到上面的代码不正确.我试图找到一种方法将所有值A加在一起,B的所有值,C的所有值以及D的所有值一起使用zip函数.例如,我想打印一些如下所示的内容:
Asum = 16
Bsum = 7
Csum = 13
Dsum = 21
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?非常感谢你花时间陪伴.
很长一段时间以来,我一直试图弄清楚将标志传递给python函数的最佳方法是什么.最直接的方式是:
def func(data, flag1, flag2, flag3):
...
func(my_data, True, False, True)
Run Code Online (Sandbox Code Playgroud)
这非常简洁,但难以理解,因为单词"True"或"False"不会告诉你什么标志正在设置,你必须仔细计算从左边开始的参数.你可以使它们成为关键字参数:
def func(data, flag1=False, flag2=False, flag3=False):
...
func(my_data, flag1=True, flag3=True)
Run Code Online (Sandbox Code Playgroud)
但这有点多余,因为"真实"根本没有任何意义.我可以将它作为列表传递:
func(mydata, ['flag1', 'flag3'])
Run Code Online (Sandbox Code Playgroud)
要么
func(mydata, [func.flag1, func.flag3])
Run Code Online (Sandbox Code Playgroud)
但第一个感觉相当脏,使用字符串作为标志,第二个仍然有点重复.理想情况下我想说的是:
func(my_data, flag1, flag3)
Run Code Online (Sandbox Code Playgroud)
将标志传递给具有最小详细程度和冗余的函数.有没有办法在python中做这样的事情?
编辑:我最终去了:
func(mydata, flagA=1, flagB=1)
Run Code Online (Sandbox Code Playgroud)
主要是出于上述原因:编译时检查(与传入字符串相比),没有名称空间污染(与使用全局"ENUM"相反)和最小样板(= 1或= 0只有2个字符,而5或6表示= True或= False).它还可以非常轻松地设置标志的默认值:
def func(data, flagA=1, flagB=0, flagC=1):
...
Run Code Online (Sandbox Code Playgroud)
这比通过箍提取并将默认值分配给**kwarg风格的标志要容易得多,而且要容易得多.标志基本上是静态检查的,非常清晰/干净.现在,如果我能剃除最后两个角色......
再次研究自己进入一个角落......
def superfunction(*args, **kwargs, k):
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
什么是我打破这里的规则?似乎你不应该将'常规'变量与*变量混合,但我找不到任何人确认或否认这一点.我读到了某个地方(我现在无法找到)当前必须先找到某些类型的参数,我相信关键字参数,这可能是也可能不是我的问题的一部分.