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运算符的兄弟:当我们有两个布尔值或整数值a和b时,如果我们想找出 a 和 b 是否都为真,请使用*而不是and 。
原始代码:
if a and b:
print("geeks")
else:
print("geeksforgeeks")
打高尔夫球的代码:
if a*b:
print("geeks")
else:
print("geeksforgeeks")
- OR运算符的兄弟:当我们有两个布尔值或整数值a和b时,如果我们想找出 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 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)