Python 在函数参数中传递元组

Python pass tuple in function argument

我正在尝试将此代码转换为 python

function foo(int[] x, int a, int b, int i, int j) returns int
    int k = j
    int ct = 0
    while k > i-1
        if x[k] <= b and not (x[k] <= a)
            ct = ct + 1
        end
        k = k - 1
    end
    return ct
end

int[] x = [11,10,10,5,10,15,20,10,7,11]
print(foo(x,8,18,3,6))
print(foo(x,10,20,0,9))
print(foo(x,8,18,6,3))
print(foo(x,20,10,0,9))
print(foo(x,6,7,8,8))

转换为python:

import pandas as pd

def foo(*x,a,b,i,j):
    ct = 0
    for k in x:
        k = j,
        ct = 0,
        while k > (i-1):
            if x[k] <b and ~(x[k]<=a):
                ct = ct+1
            else:
                k = k-1
    return ct

x = (11,10,10,5,10,15,20,10,7,11)

我看到第一个代码中的 int[] x 转换为 python 中的元组。但是,在函数 foo.

中将元组作为参数传递时,我遇到了代码转换问题

行尾 k=j, 您使用 ',' 此代码将 k 转换为 tuple 并在 while k > (i-1) 中得到 error 因为您用 int.

检查 tuple

我转换为 python,如下所示:

def foo(x, a, b, i, j):
    k = j
    ct = 0
    while k > i-1:
        if x[k] <= b and not (x[k] <= a):
            ct = ct + 1
        k = k - 1
    return ct

x = (11,10,10,5,10,15,20,10,7,11)

print(foo(x,8,18,3,6))
print(foo(x,10,20,0,9))
print(foo(x,8,18,6,3))
print(foo(x,20,10,0,9))
print(foo(x,6,7,8,8))

输出:

2
4
0
0
1

如果可能,不要使用带有大量参数的位置参数,而是使用 kwargs,例如foo(x=(1,2,3), a=4, b=5, i=6, j=7) 如果您打算将它们混合或将其拆分为明显且基于关键字的位置,这些位置不遵循或不遵循相同的类型(对您来说是元组),否则交换参数只是时间问题或通过不正确地解包值导致不同类型的混乱。

例如:

def foo(a: int, b: int, /, values: tuple, length: int = 1, start: int = 0) -> int:
    k = start
    ct = 0
    while k > length - 1:
        if x[k] <= b and not (x[k] <= a):
            ct = ct + 1
        k = k - 1
    return ct

/ 拆分仅位置参数(ab 因为我无法真正弄清楚它们在该函数中的含义)和可选的关键字参数可以也作为位置传递:

foo(100, 200, values=(9, 8, 7), length=1, start=0)
# 0
foo(100, 200, (9, 8, 7), 1, 0)
# 0

此外,Python 不强制类型,因此如果您的代码依赖于此,请使用 MyPy for static analysis and ensure.ensure_annotations decorator 动态代码(例如在测试或应用程序中)。

您已经有了一个可以接受的答案,但有时通过使用 pythonic 方式编写函数可以使一切更容易理解。

"我们要统计(求和)索引ij之间大于a且小于或的x的元素个数等于b”,因此变成:

from typing import Sequence

def foo(x: Sequence[int], a: int, b: int, i: int, j: int) -> int:
    return sum(a < v <= b for v in x[i:j])