python新知识之------------------海象表达式

海象表达式

刷力扣提突然刷到一个答案
原题如下
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-array
著作权归LeetCode网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答方案:

if k := (k % len(nums)):
    nums[:k], nums[k:] = nums[-k:], nums[:-k]

if语句中 := ,叫做海象表达式
ps:这是3.8 新特性网址:https://docs.python.org/3/whatsnew/3.8.html

官方示例1
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

传统写法1

if len(a) > 10:
    print(f"List is to long({len(a)} elements, expected <= 10)")

传统写法2

n = len(a)
if n > 10:
    print(f"List is to long({n} elements, expected <= 10)")

先将len(a)赋值给n,再判断n > 10,然后把值赋给n,相对传统写法1可以少调用一次len(a)。相对传统写法2可以简化代码。

官方示例2
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0

与官方示例1作用基本一致

官方示例3
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

传统写法:

while True:
    block = f.read(256)
    if block != '':
        process(block)
	else:        
		break

先将f.read(256)赋值给block,在判定block值,让代码更整洁。

官方示例4
[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]

将上一句中方法做替换

[x.title() for y in list if (x := f(y))]

传统写法

[f(y).title() for y in list if f(y)]

这样可以避免调用两次 f(y)
回到原题中,分为以下三种情况:
k 小于 nums 长度,且 k 不为 0 时,直接将 nums 中前 k 个和后 k 个互换即可。
k = 0 或 k 为 nums 长度的整数倍时,不变,输出 nums。
k > len(nums),k对 len(nums) 取余,再重复 k 小于 nums 长度步骤即可。
传统写法:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
		if (k % len(nums)):
    		k = k % len(nums)
    		nums[:k], nums[k:] = nums[-k:], nums[:-k]
		return nums

使用海象表达式写法:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
		if k := (k % len(nums)):
    		nums[:k], nums[k:] = nums[-k:], nums[:-k]
    	return nums
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想当个程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值