Python系统自动化运维-day03 Python 基础语法

1 数字运算

编程是将问题数据化的一个过程,数据离不开数字,Python 的数字运算规则与我们学习 的四则运算规则是一样的,即使不使用 Python 来编写复杂的程序,也可以将其当作一个强大 的计算器。打开 Python,试运行以下命令:

>>> 2 + 2 
4 
>>> 50 - 5*6 
20 
>>> (50 - 5*6) / 4 
5.0 
>>> 8 / 5 # 总是返回一个浮点数
1.6 

不同的机器上浮点运算的结果可能会不一样。

 Python 数字类型转换:

  • int(x) 将 x 转换为一个整数。
  • float(x) 将 x 转换为一个浮点数。
  • complex(x) 将 x 转换为一个复数,实数部分为 x,虚数部分为 0。
  • complex(x, y) 将 x 和 y 转换为一个复数,实数部分为 x,虚数部分为 y。x 和 y 是 数字表达式。

常用的数学函数

  • 内置函数

python 内置函数一览表:Built-in Functions,其中与数学有关的有:

函数描述实例
abs(x)返回 x 的绝对值abs(-2) 返回 2, abs(-2.0) 返回 2.0
max(x1,x2,...)返回给定参数的最大值max(1, 2) 返回2,max(1, 2, 3) 返回3
min(x1,x2,...)返回给定参数的最小值min(1, 2) 返回1,min(1, 2, 3) 返回1
oct(x)将 x 转换为以“0o”为前缀的八进制字符串oct(10) 返回 '0o12'
pow(base, exp)等效于使用幂运算符:base**exp。pow(2, 3) 返回 8
round(x[, ndigits])返回浮点数x四舍五入的值,若给出ndigits,则四舍五入到 ndigits 精度round(5.555) 返回 6round(5.555, 1) 返回 5.6
sum(iterable, /, start=0)从 start 开始对 iterable 的各项求和并返回总数sum((1, 2, 3)) 返回 6
sqrt(x)返回数字 x 的平方根sqrt(4)返回2
  • math 模块

python 中数学运算常用的函数基本都在 math 模块中。math 模块中的函数不能用于复数,如需支持复数,可使用 cmath 模块中的同名函数。

查看 math 模块的内容:

>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
>>> help(math)

2 字符串的格式化

Python 支持格式化字符串的输出。尽管这样可能会用到非常复杂的表达式,但最基本的 用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

>>> print ("我叫 %s 今年 %d 岁!" % ('小明', 10))#使用% 
我叫 小明 今年 10 岁! 
>>> print ("我叫 {} 今年 {} 岁!" .format('小明', 10))#使用字符串的 format 方法
我叫 小明 今年 10 岁! 
>>> print ("我叫 {0} 今年 {1} 岁!" .format('小明', 10,20))#使用索引,整数 20 未用到
我叫 小明 今年 10 岁! 

需要在字符中使用特殊字符时,Python 用反斜杠(\)转义字符,如表所示。

转义字符描述
\ (在行尾时)续行符
\\反斜杠符号
\’单引号
\"双引号
\a响铃
\b退格(Backspace)
\000
\n换行
\v纵向制表符
\t横向制表符
\r回车
\f换页
\oyy八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。
\xyy十六进制数,yy代表的字符,例如:\x0a代表换行
\other其它的字符以普通格式输出

print() 函数使用以%开头的转换说明符对各种类型的数据进行格式化输出,具体请看下表。

 Python 转换说明符
转换说明符解释
%d、%i转换为带符号的十进制整数
%o转换为带符号的八进制整数
%x、%X转换为带符号的十六进制整数
%e转化为科学计数法表示的浮点数(e 小写)
%E转化为科学计数法表示的浮点数(E 大写)
%f、%F转化为十进制浮点数
%g智能选择使用 %f 或 %e 格式
%G智能选择使用 %F 或 %E 格式
%c格式化字符及其 ASCII 码
%r使用 repr() 函数将表达式转换为字符串
%s使用 str() 函数将表达式转换为字符串

转换说明符(Conversion Specifier)只是一个占位符,它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。

字符串的内建函数

官网:内置类型 — Python 3.7.13 文档

3 可迭代对象、迭代器和生成器

迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住 遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束。迭 代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串、列表或元组对 象都可用于创建迭代器。

首先来了解一下可迭代对象、迭代器和生成器的概念

(1)可迭代对象:如果一个对象拥有__iter__方法,这个对象就是一个可迭代对象。在 Python 中,我们经常使用 for 来对某个对象进行遍历,此时被遍历的对象就是可迭代对象,常 见的有列表、元组、字典。for 循环开始时自动调用可迭代对象的__iter__方法获取一个迭代器, for 循环时自动调用迭代器的 next 方法获取下一个元素,当调用可迭代器对象的 next 方法引发 StopIteration 异常时,结束 for 循环。

(2)迭代器:如果一个对象拥有__iter__方法和__next__方法,这个对象就是一个迭代器。

(3)生成器:生成器是一类特殊的迭代器,就是在需要时才产生结果,而不是立即产生 结果。这样可以同时节省 CPU 和内存。有两种方法可以实现生成器:

  • 生成器函数。使用 def 定义函数,使用 yield 而不是 return 语句返回结果。yield 语句 一次返回一个结果,在每个结果中间挂起函数的状态,以便下次从它离开的地方继续 执行。
  • 生成器表达式。类似于列表推导,只不过是把一对大括号[]变换为一对小括号()。但 是生成器表达式是按需产生一个生成器结果对象,要想拿到每一个元素,就需要循环 遍历。

三者之间的关系:

 

可迭代对象包含迭代器、序列、字典;生成器是一种特殊的迭代器,下面分别举例说明。

创建一个迭代器对象(lx_iterator.py)

class MyListIterator(object):  # 定义迭代器类,其是 MyList 可迭代对象的迭代器类

    def __init__(self, data):
        self.data = data  # 上边界
        self.now = 0  # 当前迭代值,初始为 0

    def __iter__(self):
        return self  # 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回 self

    def __next__(self):  # 迭代器类必须实现的方法
        while self.now < self.data:
            self.now += 1
            return self.now - 1  # 返回当前迭代值
        raise StopIteration  # 超出上边界,抛出异常

# 因为类MyListIterator实现了__iter__方法和__next__方法,所以它是一个迭代器对象。由于__iter__方法本返的是迭代器(本身),因此它也是可迭代对象。迭代器必然是一个可迭代 对象。
# 下面使用三种方法遍历迭代器MyListIterator。
my_list = MyListIterator(5) # 得到一个迭代器
print("使用 for 循环来遍历迭代器")
for i in my_list:
    print(i)
my_list = MyListIterator(5) # 重新得到一个可迭代对象
print("使用 next 来遍历迭代器")
print(next(my_list))
print(next(my_list))
print(next(my_list))
print(next(my_list))
print(next(my_list))
my_list = MyListIterator(5) # 重新得到一个可迭代对象
print("同时使用 next 和 for 来遍历迭代器")
print("先使用两次 next")
print(next(my_list))
print(next(my_list))
print("再使用 for,会从第三个元素 2 开始输出")
for i in my_list:
    print(i)

从代码结果可以看出,for 循环实际上就是调用了迭代器的__next__方法,当捕捉到 MyListIterator 异常时自动结束 for 循环。


版权声明:本文为moyu11111原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。