• 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]
    
    • 1
    • 2

    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
    • 2

    传统写法1

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

    传统写法2

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

    先将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
    • 2
    • 3

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

    官方示例3

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    • 1
    • 2
    • 3

    传统写法:

    while True:
        block = f.read(256)
        if block != '':
            process(block)
    	else:        
    		break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    官方示例4

    [clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]
    
    • 1

    将上一句中方法做替换

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

    传统写法

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

    这样可以避免调用两次 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用海象表达式写法:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    gofs使用教程-基于golang的开源跨平台文件同步工具
    mysql- 主从复制的搭建过程
    【C++】 AVL树
    verilog学习笔记7——PMOS和NMOS、TTL电路和CMOS电路
    JAVA使用SnakeYAML解析与序列化YAML
    Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集)
    Spring中@Bean标注的方法是如何创建对象呢?
    ESP32 之 ESP-IDF 教学(二十)—— SNTP校时
    Redis之主从复制、哨兵模式、集群模式
    java学习第七天注解.day19
  • 原文地址:https://blog.csdn.net/A_Tu_daddy/article/details/126278830