⑴ python笔记-取模运算%
对于该算术运算符: % ,取模运算存在如下定理:
对于一个正整数 而言,一定存在等式 ,代表 可以被拆分成最多 个 并且余下一个 ,此时称 。
例如:正整数 17,存在等式 17 = 3 * 5 + 2,即 17 % 5 = 2.
这里介绍一下数学中的一种运算, 取余运算 。
两者在对正整数的运算中完全没有区别,但是对于负整数的运算,则会存在一定的区别。
但是要记住下面这句话,就可以很好的进行区分:
取余公式中的k要向0靠拢,也就是如果大于等于0,那就要向下取整;如果小于0,那就要向上取整。
取模公式中的k要向负无穷靠拢,不管什么情况,都是向下取整。
或者是
向上取整 math.ceil() 可以理解成 要选择大于等于该数值的整数部分的最小整数;
向下取整 math.floor() 可以理解成 要选择小于等于该数值的整数部分的最大整数。
也就是:
下面做些实际运算,加深一下印象:
⑵ python中//是什么意思
在Python" // "表示整数除法。
Python其它表达式:
Python的表达式写法与C/C++类似。只是在某些写法有所差别。
主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取余。
>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,
分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。
Python使用and, or, not表示逻辑运算。
is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。
Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:
>>> sum(x * x for x in range(10))
285
Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
>>> add=lambda x, y : x + y
>>> add(3,2)
Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。
Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。
在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:
>>> x, y=1,2 # 同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>> x, y=y, x #最终结果:y=1, x=2
Python使用'(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。
出现在字符串中的(反斜杠)被解释为特殊字符,比如 表示换行符。表达式前加r指示Python不解释字符串中出现的。这种写法通常用于编写正则表达式或者Windows文件路径。
Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。
它的语法是...[left:right]或者...[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:
nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。
nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。
nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。
nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。
nums[1:5:2] == [3, 7] 从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2。
⑶ 在python中,为什么-10//-3结果是-1,-10//3结果为2,10//-3为-2。结果怎么理解
简单理解就是的出来的结果如果不是整数, 就取比结果小的最大整数
比如 -10/4.0 = -2.5 , 取比-2.5小的最大整数, 就是-3, 所以 -10//4=-3
⑷ python中取整
定义:大于或等于 x 的最大整数 math.ceil(x)
向上取整运算为Ceiling,用数学符号⌈⌉表示
定义:小于或等于 x 的最大整数 math.floor(x)
向上取整运算为Floor,用数学符号⌊⌋表示
其实反斜杠 // 也能实现向下取整:
但是在某些情况下 // 和 math.floor(x) 的实现结果又不一样:
还是因为浮点数在计算机中存储值并不是0.05而是0.05...125,具体解释还是看这里吧 为什么Python中//和math.floor运算结果会不同 。
向0取整:x为负数时向上取整,x为正数时向下取整。
python中可用 int(x) 实现,也可以用 math.modf(x) 返回一个包含小数部分和整数部分的元组。
有人可能会对 math.modf(-2.36) 结果感到好奇,按理说它应该返回 (0.36, 2.00) 才对。这里涉及到了另一个问题,即浮点数在计算机中的表示,在计算机中是无法精确的表示小数的,至少目前的计算机做不到这一点。上例中最后的输出结果只是 0.36 在计算中的近似表示。
Python和C一样, 采用IEEE 754规范来存储浮点数,更详细解释,可以参考知乎话题:
为什么0.1+0.2=0.30000000000000004而1.1+2.2=3.3000000000000003
从官方文档得知,Python中 round(x) 采用银行进位法而非传统的四舍五入。
银行进位规则:
① 如果保留数最后一位不等于5,则执行四舍五入,例如 round(5.234, 2)=5.23 round(5.236, 2)=5.24
② 如果保留数最后一位等于5,则取决于5的位置和状态:⑴ 如果5后有数,不论奇偶都要进位,例如 round(5.2354, 2)=5.24 ;⑵ 如果5后没有数,则需要看5的前一位奇偶性,奇进偶舍,例如 round(5.235, 2)=5.24 , round(5.225, 2)=5.22
但是!注意!:
内心中一片乌鸦飞过,说好的奇进偶舍呢???其实我内心也是奔溃的,继续找答案:
我们都知道,计算机所存储的浮点数并不是表面这么简单,他并不是一个精确值,可以用decimal模块的Decimal对象,将float数据映射为底层的更精确的表示。:
round还是那个round,过错就在于float对象“眼见而非实”上,那到底如何实现真正意义四舍五入呢??
decimal模块是Python的一个标准库,是专门为十进制小数的精确计算而设计的,使用decimal模块的接口,可以实现小数精确的四舍五入,具体不多做展开了,可以参考官方文档...暂时我也用不到decimal
一路写下来,结论就是float心机好深,操作真的要小心点...
⑸ python中36%-5为什么等于-1
36%-5根本就不等于-1,36%-5等于-4好吧?
下图是验证:
为什么36%-5等于-4?
因为%是求余数,余数=被除数-被除数//除数*除数。
而//是整除,对于python语言//是向下取整,即向负无穷大方向取整,结果是不大于商的最大整数。
36除以-5的商是-7.2,不大于-7.2的最大整数是-8,所以36//-5等于-8。
所以36%-5=36-(36//-5)*(-5)=36-(-8)*(-5)=36-40=-4。