python cpp 语法对比(记录中)

前言:python 函数

1. next(), iter()

可迭代对象

  • 一类是:list、tuple、dict、set、str
  • 一类是:generator(包含生成器与带 yield 的 generator function)
    生成器不但可以作用于 for,还可以被 next函数 不断调用并且返回下一个值,可以被 next函数 不断调用返回下一个值的对象称为 迭代器(Iterator)。可迭代的对象如 listdict 等需要用 iter()函数 转化成 Iterator

next 用法

next(iterator[, default])

  • iterator --可迭代对象
  • default --可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
    在这里插入图片描述

2. For …; else: 用法

for 循环有一个大多数人都不熟悉 else 子句,

  1. else 子句在循环正常完成时执行,这意味着循环没有遇到任何 break 语句
  2. 【注意】当 for循环不执行时(例如 for i in range(2, 2):),也会进入到 else

用法如下:

class Solution:
    def isPrefixOfWord(self, sentence: str, searchWord: str) -> int:
        lst = sentence.split(' ')
        for idx, item in enumerate(lst):
            for i in range(len(searchWord)):
                if i>=len(item) or searchWord[i]!=item[i]:
                    break 	
            else:  	# 👀 当for循环正常完成时,执行else。
                return idx+1
        return -1

一、python / cpp对比

1. 数组

数组的索引:
python

a = [1,2,5,9,2]
a_idx = a.index(2)   # a_idx = 

cpp

#include<algorithm>
std::vector<int> a{1,2,5};
std::vector<int>::iterator a_idx = find(a.begin(), a.end(), 5);

2. lambda 函数

cpp: [](T a, T b){ return a<b;}
py::lambda a, b: a<b

3. 排序

  • cpp 只能对 随机访问容器 排序,例如对 vector<int> nums
    • sort(nums.begin(), nums.end(), [](int a, int b){ return a > b;}); 无返回值
  • py 对 可迭代容器 排序,例如 list(), 下面我们举例 无序字典 a = defaultdict() 的value排序
    from collections import defaultdict
    a = defaultdict()
    a[3] = [3, 4]
    a[1] = [4, 2]
    a[2] = [1, 1]

    b = sorted(a.items(), key=lambda x: x[1]) # 对 list[1]进行排序

返回一个 List[tuple, tulpe, ..., ]

  • py,使用 cmp_to_key 进行排序
from functools import cmp_to_key
a = [1,4,6,2,5,2,4,79,2,4,6]
def compare(x: int, y: int)->int:
    return x-y
a.sort(key=cmp_to_key(compare))
# [1, 2, 2, 2, 4, 4, 4, 5, 6, 6, 79]
def myReverse(x: int, y: int)->int:
    return y-x
a.sort(key=cmp_to_key(myReverse))
# [79, 6, 6, 5, 4, 4, 4, 2, 2, 2, 1]

179. 最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:"210"
示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"
 

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 109

py方法:使用 com_to_key 进行排序
比较 a+b 与 b+a 的大小

  • 使用 lambda 函数
from functools import cmp_to_key
    def largestNumber(self, nums: List[int]) -> str:
        lst = list(map(str, nums))
        lst.sort(key=cmp_to_key(lambda x, y: int(y+x)-int(x+y)))
        ans = "".join(lst)
        return ans if int(ans)!=0 else "0"
  • 使用 定义函数
    def largestNumber(self, nums: List[int]) -> str:
        lst = list(map(str, nums))
        def compare(x: str, y: str)->int:
            return int(x+y)-int(y+x)
        lst.sort(key=cmp_to_key(compare), reverse=True)
        ans = "".join(lst)
        return ans if int(ans)!=0 else "0"

4. 输入输出

  1. 第一行输入 n 个人
    第二行输入每个人的考试分数

cpp

void test(){
	int n;
	cin >> n;
	vector<int> grades(n);
	for (int i=0; i<n; i++) cin >> grades[i];
}

python

	n = int(input().strip())
    grades = list(map(int, input().strip().split(' ')))
  1. 多组输入数据(每组3个数据),不说明多少组,直到读至输入文件末尾为止

cpp

int a, b, c;		 	方法1:用变量表示
vector<int> data(3); 	方法2:用数组表示
while(cin>>data[0]>>data[1]>>data[2]){
	// 略
} 

python

while True:
	try: 
		a, b = map(int, input().strip().split())
		print(a, b)
	except EOFError:
		break
  1. 多组数据,每一行第一个数字代表这一组共有几个数据。当行中第一个数字为0时结束。

cpp

while (true){
	int n;
	cin >> n;
	if (n==0) break;
	vector<int> data(n);
	for (int i=0; i<n; i++) cin>>data[i];
	cout << data.size();
}

python

while True:
    data=list(map(int,input().strip().split()))
    n,array=data[0],data[1:]
    if n==0:
        break
    print(sum(array))

5. 逻辑符号

逻辑取反
cpp:!
py:not

6. 全局变量,非局部变量

  • global 表示将变量声明为全局变量
  • nonlocal 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量)
if __name__=="__main__":
    ans = 0
    def func():
        global ans
        ans -= 1
        tt = 0
        print(ans)
        def tmp():
            global ans
            nonlocal tt
            tt += 1
            ans -= 1
            print(ans)
            print(tt)
        tmp()
    func()
-1
-2
1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值