Logic
向着梦想进发
Logic's Blog

【快速入门】python 与 cp

这篇博客旨在帮助 C++ 选手快速入门 Python(皮炎通红)。当然 python 的使用过于灵活,而且自带的方法太多,这篇博客尽我所能列举与算法竞赛有关的内容。

循环结构、选择结构与代码规范

python 只用 range_based_for 和 while 循环。比较特殊的是,python有 for else 语法,只是用处非常少。

python 的分支结构使用 if elif else。

python 使用 : 开始一段代码块,使用缩进区分附属关系。python 是强格式语言,与 C++ 不同。

输入输出

python 使用 input() 函数进行输入。input() 是按照行读入的,这意味着它会一直读到换行结束,返回一个从行首开始去掉 '\n' 的字符串。

当 input() 读到 EOF 时,会抛出一个 EOF ERROR。

还有一种方式是使用 sys.stdin 来读入。但是请注意,如果代码运行在 IDLE 或者其他没有终端的地方时,stdin 默认是 None,这时就不能使用它来读入了【参见 stackoverflow】

同样的,python 使用 print() 进行输出。 print() 支持不定长参数,它会用 ' ' 隔开每个参数,而且默认在结尾输出换行。 print() 的好处在于 py 中自带的类型都自带了 __str__() 或者 __repr__() 的魔术方法(Magic Methods),甚至如果这两种方法都没有定义, print() 也会直接输出对象的类型信息和内存地址。

我们来看 print() 的函数原型。其中的 * 表示了压缩,它会把输入的参数压缩成一个列表传入函数。注意:这里的 * 写在函数定义中,如果它出现在函数调用中,它就成了解压的操作(压缩的逆运算)。

看一些示例:

我们可以使用格式化字符串或者 f 字符串进行输出。

注释

python 使用 # 注释,等价于 C++ 中的 //。当然还可以使用三引号来进行多行注释,等价于 C++ 中的 /**/

类型

  1. 数字类型:(注意 python 自带高精)
    • 整数(int):表示整数值,如 -10、0、42 等。
    • 浮点数(float):表示带有小数点的数值,如 3.14、-0.001、2.0 等。
    • 复数(complex):表示具有实部和虚部的复数,如 3+4j、-2-5j 等。
  2. 布尔类型
    • 布尔值(bool):表示逻辑值,只有两个取值:True 和 False。(注意首字母是大写的)
  3. 序列类型:(注意 python 无数组)
    • 字符串(str):表示文本序列,由单引号、双引号或三引号括起来的字符序列,如 'hello'、"world"、'''Python''' 等。(注意是 str 不是 string)
    • 列表(list):表示有序可变序列,由方括号括起来的一组值,值之间用逗号分隔,如 [1, 2, 3]、['a', 'b', 'c'] 等。
    • 元组(tuple):表示有序不可变序列,由圆括号括起来的一组值,值之间用逗号分隔,如 (1, 2, 3)、('a', 'b', 'c') 等。
  4. 映射类型
    • 字典(dict):表示键值对的集合,由花括号括起来,键值对之间用冒号分隔,如 {'name': 'Alice', 'age': 30}。(注意这是哈希表不是平衡树)
  5. 集合类型
    • 集合(set):表示无序不重复元素的集合,由花括号括起来,元素之间用逗号分隔,如 {1, 2, 3}、{'a', 'b', 'c'}。(注意这是哈希表不是平衡树,空集使用 set() 构造而非 {},后者表示空字典)
  6. NoneType 类型
    • NoneType:表示空值或空对象,只有一个取值:None。

变量与表达式

在 python 中变量无需声明类型,编译器会自动判断类型。而且 python 是一种动态类型语言,这意味着同一个变量的类型是可以改变的,当然,你最好不要这么做。变量名命名与 C++ 相同,不过注意 python 中类的名称必须是首字母大写。值得注意的是,python 支持中文作为变量名。

在 python 中赋值表达式的形式与 C++ 不同:

我们来看 C++ 中的表达式:

  • 算数表达式:
  • 比较表达式
  • 逻辑表达式
  • 成员表达式:用于检查一个值是否属于某个集合的表达式,结果是布尔值 True 或 False。成员运算符包括 in 和 not in。例如:
  • 身份表达式:用于检查两个对象是否引用同一个内存地址的表达式,结果是布尔值 True 或 False。身份运算符包括 is 和 is not。例如:
  • 位运算表达式:用于对整数进行位运算的表达式,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)等运算。例如:
  • 列表表达式:支持多层嵌套
  • 三目运算:这与 C++ 中的三目运算类似

函数和 lambda 表达式

python 中函数的定义需要写上 def 。定义可以写在任何位置,可以是循环体或者函数体中,不过要注意变量的作用域。

当然你可以加上类型修饰使得函数更加清晰。这样会使得代码更加安全。

在函数定义中,你可以使用 * 和 ** 来压缩参数。* 表示压缩成列表,而 ** 表示压缩成字典。

而函数调用的过程中,* 和 ** 用来解压参数。* 用以解压列表,** 用以解压字典。

我们来看 lambda 表达式。lambda 表达式是一种用于创建匿名函数的特殊语法。它允许你在代码中创建简单的函数,而不需要使用 def 关键字定义一个常规函数。

lambda表达式的基本语法是:

文件读写

python 使用 open() 函数打开一个文件。

我们可以把文件存入一个变量,例如 f = open(file, 'w')。但是这样不够安全,我们可以使用 with 来打开一个文件。

迭代器

与 C++ 中的迭代器相同。

迭代器(Iterator)是Python中一种用于遍历可迭代对象(Iterable)的对象。可迭代对象是可以返回一个迭代器的任何对象,包括列表、元组、字典、集合、字符串等。

迭代器提供了一种惰性计算的方式,它允许你逐个访问可迭代对象的元素,而不需要一次性将所有元素加载到内存中。这对于处理大型数据集或无限序列(如生成器)非常有用,因为它可以节省内存并提高效率。

迭代器对象必须实现两个方法:

  1. __iter__() 方法:返回迭代器对象自身,通常直接返回 self
  2. __next__() 方法:返回可迭代对象的下一个元素,如果没有元素可以返回,则抛出 StopIteration 异常。

生成器

生成器(Generator)是一种特殊的迭代器,它以一种延迟计算的方式生成值,而不是一次性产生所有值并保存在内存中。生成器可以通过函数中的 yield 关键字来定义,也可以使用生成器表达式或生成器函数来创建。

生成器函数:通过在函数中使用 yield 关键字来定义生成器。

生成器表达式:类似于列表推导式,但使用圆括号而不是方括号。

修饰器

修饰器(Decorator)是 Python 中一种强大的元编程特性,它允许修改或增强函数或类的行为,而无需修改它们的源代码。修饰器本质上是一个可调用的对象,它接受一个函数或类作为参数,并返回一个新的函数或类。通过将修饰器应用于函数或类,我们可以在不修改原始函数或类定义的情况下,实现一些额外的功能,如日志记录、性能分析、权限控制等。

修饰器的基本结构如下:

下面是一个统计函数运行时间的修饰器示例:

在这个示例中,我们定义了一个名为 calculate_time 的修饰器,它接受一个函数作为参数,并返回一个新的包装函数 wrapper。在 wrapper 函数中,我们记录了函数调用开始和结束的时间,并计算了函数的运行时间。最后,我们使用 @calculate_time 将修饰器应用于 my_function 函数,这样当我们调用 my_function() 时,修饰器就会自动记录函数的运行时间,并输出到控制台。

面向对象和魔术方法

之后的内容有时间再写。

高级函数

数据结构

一些小 tricks

赞赏
本文作者: Logic
本文链接: https://i.needwe.top/would-you-like-some-python-today/
本文采用 CC BY-NC-SA 4.0 Unported 协议进行许可
没有标签
首页      little-talk      【快速入门】python 与 cp

发表回复

textsms
account_circle
email

Logic's Blog

【快速入门】python 与 cp
这篇博客旨在帮助 C++ 选手快速入门 Python(皮炎通红)。当然 python 的使用过于灵活,而且自带的方法太多,这篇博客尽我所能列举与算法竞赛有关的内容。 循环结构、选择结构与代码规…
扫描二维码继续阅读
2024-04-21