📜  Python中的代码打高尔夫球

📅  最后修改于: 2022-05-13 01:54:33.706000             🧑  作者: Mango

Python中的代码打高尔夫球

Python中的Code Golf是指尝试使用尽可能少的字符来解决问题。就像在高尔夫中一样,低分获胜,最少的字符“获胜”。

由于向后兼容性、怪癖、它是一种高级语言以及所有强制, Python是一种用于代码打高尔夫球的绝佳语言。所以,在这里我们将看一些Python语言的代码打高尔夫球技术。

使用循环

折叠两个数值循环:假设您正在迭代m 行n 列的矩阵。而不是两个嵌套的 for 循环,一个用于行和一个列,使用单个循环来迭代 m*n 矩阵通常更短。

原始代码:

m = n = 3
for i in range(m):
    for j in range(n):
        print(i, j)

打高尔夫球的代码:

m = n = 3
for i in range(m*n):
    print(i//n, i%n)

这种技术不仅限于两个嵌套循环,我们甚至可以为3 个或更多嵌套循环编写相同的循环

m, n, o = 2, 3, 4
for k in range(m*n*o):
    print(k//n//o, k%(n*o), k%o)

使用运算符

  • 加或减 1:对于整数 n,你可以写
    • -~n等价于n+1
    • ~-n等价于n-1

这是有效的,因为位翻转~x等于-x-1 。这使用相同数量的字符,但可以间接削减运算符优先级的空格或括号。

  • 集合中的成员资格:我们在Python中将集合写为 S = {1, 2, 3, 4, 5}。要检查集合 S 中是否存在元素 e,我们可以检查条件为{e}&S

    原始代码:

S = {1, 2, 3, 4, 5, 6, 7}
if 5 in S:
    print("Present")
else:
    print("Absent")

打高尔夫球的代码:

S = {1, 2, 3, 4, 5, 6, 7}
if {5}&S:
    print("Present")
else:
    print("Absent")
  • AND运算符的兄弟:当我们有两个布尔值或整数值ab时,如果我们想找出 a 和 b 是否都为真,请使用*而不是and

    原始代码:

if a and b:
    print("geeks")
else:
    print("geeksforgeeks")

打高尔夫球的代码:

if a*b:
    print("geeks")
else:
    print("geeksforgeeks")
  • OR运算符的兄弟:当我们有两个布尔值或整数值ab时,如果我们想找出 a 和 b 中的任何一个是否为真或两者都为真,请使用|而不是or

    原始代码:

if a or b:
    print("geeks")
else:
    print("geeksforgeeks")

打高尔夫球的代码:

if a|b:
    print("geeks")
else:
    print("geeksforgeeks")
  • 使用 += 而不是 append:我们可以使用 +=运算符,而不是使用 append 将一项添加到现有列表中。

    原始代码:

A.append(B)

打高尔夫球的代码:

A+=B,

注意:B,这里创建一个单元素元组,可以用来扩展 A,就像 A+=[B] 中的 [B]。

  • 使用 += 而不是扩展:我们可以使用 +=运算符,而不是使用扩展来将一个列表合并到另一个列表中。

    原始代码:

A.extend(B)

打高尔夫球的代码:

A+=B
  • 神奇的比较运算符:我们面临很多情况,我们必须将单个变量与不同的值进行比较,通常我们通过不同的比较来保护它们,并将它们与AND运算符结合起来。但是Python允许我们将所有运算符放在一行中,而无需使用AND运算符。
    原始代码:
if a>1 and a<10:
    print(a)

打高尔夫球的代码:

if 1

注意:我们也可以同时将此技术用于多个变量。

原始代码:

if a > 10 and b > 10 and 30 > a and 50 > b:
    print(a)

打高尔夫球的代码:

if 30 > a > 10 < b < 50:
    print(a)

使用函数

  • 楼层函数的兄弟:假设我们要找到一个实数的楼层值,我们通常从数学中导入楼层函数,然后应用到数字上。但是我们可以简单地使用 1 进行除法,这将给我们带来丰硕的成果。

    原始代码:

from math import floor
n = 3/2
print(floor(n))

打高尔夫球的代码:

n = 3/2
print(n//1)
  • Ceil函数的兄弟:假设我们要找到一个实数的 ceil 值,我们通常从数学中导入 ceil函数,然后应用到该数字上。但是我们可以用更漂亮的方式来做这个操作,首先乘以 -1,然后用 1 应用地板除法,然后再乘以 -1。

    原始代码:

from math import ceil
n = 3/2
print(ceil(n))

打高尔夫球的代码:

n = 3/2
print(-(-n//1))
  • Lambda 函数:Lambda 定义不包含“return”语句,它总是包含一个返回的表达式。我们还可以将 lambda 定义放在任何需要函数的地方,我们根本不必将它分配给变量。这就是 lambda 函数的简单性。

    原始代码:

def c(a):
  if a < 3: return a-5
  else: return a+5

打高尔夫球的代码:

c=lambda a:a<3and a-5or a+5
  • 获取整个字母字符串:我们可以使用Python的map函数来获取整个字母集的字符串。

    原始代码:

string = 'abcdefghijklmnopqrstuvwxyz'
or 
string = [chr(i+97)for i in range(26)]

打高尔夫球的代码:

string = map(chr,range(97,123))

使用索引

  • 条件索引技术:当我们有某个条件会以小整数的形式给出答案时,我们可以在列表或元组的整数索引中使用它来获得最终答案。

    原始代码:

if a

打高尔夫球的代码:

return (b, a)[a
  • 反转序列:我们可以使用好的外星人笑脸反转任何列表序列。

    原始代码:

string = 'geeksforgeeks'
for i in range(len(string)-1,-1,-1):
    print(string[i])

打高尔夫球的代码:

string = 'geeksforgeeks'
for i in string[::-1]:
    print(i)
  • 使用 ~ 从列表后面开始索引:如果 L 是列表,则使用 L[~i] 从后面获取第 i 个元素。这是 L 的倒数的第 i 个元素。位补码 ~i 等于 -i-1,因此修复了来自 L[-i] 的非一错误。

    原始代码:

string = 'geeksforgeeks'
for i in range(len(string)-1,-1,-1):
    print(string[i])

打高尔夫球的代码:

for i in range(len(string)):
    print(string[~i])
  • 打印列表的项目:我们可以通过使用带有列表名称的*运算符而不是循环遍历列表来打印列表的项目。

    原始代码:

A = [1,2,3,4,5,6,7]
for i in A:
    print(i,end = ' ')

打高尔夫球的代码:

A = [1,2,3,4,5,6,7]
print(*A) 

使用赋值

  • 为多个变量分配相同的值:我们可以在单行或多行中为多个变量分配相同的值。
    原始代码:
# multiple lines
a = 0
b = 0
c = 0

# single line
a,b,c = 0,0,0

打高尔夫球的代码:

a = b = c = 0
  • 为变量分配相同或不同的字符:我们可以在单行或多行中将相同或不同的字符分配给多个变量。
    原始代码:
# multiple lines
a = 'p'
b = 'q'
c = 'r'

# single line
a,b,c = 'p','q','r'

打高尔夫球的代码:

a,b,c = 'pqr'

使用转换

  • 将可迭代对象转换为列表:假设您有任何有序的可迭代对象,例如元组或字符串,但您想将其转换为列表,因此您可以使用*运算符完成此操作。

    原始代码:

a = (2,3,5,7,11)
x = list(a)

a = 'geeksforgeek'
x = list(a)

打高尔夫球的代码:

a = (2,3,5,7,11)
*x, = a

a = 'geeksforgeeks'
*x, = a
  • 将可迭代对象转换为集合:假设您有任何可迭代对象,如列表、元组或字符串,但您想将其转换为集合,因此您可以使用*运算符完成此操作。

    原始代码:

a = (2,3,5,7,11)
x = set(a)

a = [2,3,5,7,11]
x = set(a)

a = 'geeksforgeeks'
x = set(a)

打高尔夫球的代码:

a = (2,3,5,7,11)
x = {*a}

a = [2,3,5,7,11]
x = {*a}

a = 'geeksforgeeks'
x = {*a}
  • 将可迭代对象转换为元组:假设您有任何可迭代对象,例如列表、集合或字符串,但您想将其转换为元组,因此您可以使用*运算符来实现。

    原始代码:

a = (2,3,5,7,11)
x = tuple(a)

a = [2,3,5,7,11]
x = tuple(a)

a = 'geeksforgeeks'
x = tuple(a)

打高尔夫球的代码:

a = (2,3,5,7,11)
x = (*a,)

a = [2,3,5,7,11]
x = (*a,)

a = 'geeksforgeeks'
x = (*a,)

在加入不同的迭代期间

  • 加入多个列表:我们可以使用+运算符加入多个列表,但对于代码打高尔夫球,我们可以使用*运算符来做同样的事情。

    原始代码:

T = [2,3,4,5,6,7,8,9]
new_T = [1]+T+[10]

打高尔夫球的代码:

T = [2,3,4,5,6,7,8,9]
new_T = [1,*T,10]
  • 加入多个列表:我们可以使用+运算符加入多个列表,但对于代码打高尔夫球,我们可以使用*运算符来做同样的事情。

    原始代码:

T = (2,3,4,5,6,7,8,9)
new_T = (1,)+T+(10,)

打高尔夫球的代码:

T = (2,3,4,5,6,7,8,9)
new_T = (1,*T,10)