文章目录
前言:python 函数
1. next(), iter()
可迭代对象
- 一类是:list、tuple、dict、set、str
- 一类是:generator(包含生成器与带 yield 的 generator function)
生成器不但可以作用于for
,还可以被next函数
不断调用并且返回下一个值,可以被next函数
不断调用返回下一个值的对象称为迭代器(Iterator)
。可迭代的对象如list
、dict
等需要用iter()函数
转化成Iterator
。
next 用法
next(iterator[, default])
- iterator --可迭代对象
- default --可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
2. For …; else: 用法
for 循环有一个大多数人都不熟悉 else 子句,
- 该 else 子句在循环正常完成时执行,这意味着循环没有遇到任何 break 语句。
- 【注意】当 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. 输入输出
- 第一行输入 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(' ')))
- 多组输入数据(每组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
- 多组数据,每一行第一个数字代表这一组共有几个数据。当行中第一个数字为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