python初学问题总结

1.注意浮点除法'/'和整数除法'//' 的区别

2.注意整数除法与c语言的区别,c语言是向0取整,python是向下取整:

先用浮点除法python计算5➗3的精确值:

>>> 5/3
1.6666666666666667
>>> -5/3
-1.6666666666666667

c语言整数除法:

5 / 3    //1
-5 / 3    //-1

python整数除法:

>>> 5 // 3
1
>>> -5 // 3
-2

由此可得结论,对于正数的整数除法,python与c的结果一样;对于负数则不一样。

3.注意取模运算python与c语言的区别:

具体分析: c语言:

python:

发现c语言和py中,-5对3取模,结果分别为-2和1。这两种结果都对,因为

总结:对于正数,py与c语言取模结果一样;对于负数则不一样,一般c语言取模为负数,py为正

4.list和tuple的双冒号切片:

s[i:j:k]表示:切片第从ij,间隔为1k

10以内的数,默认从开始到末尾,且间隔为1

20以内的数,从第1到第18号,间隔为3

k为负数,表示反向

k为-2,表示从0号开始,反向每2个元素取一个(第一个是0,第二个是9,第三个是8,第四个是7,以此类推......)

注意:使用负数间隔时,若要自己指定起始范围,则范围应该也是反向的。 如:20以内的数,从10号开始,到0号结束,每次间隔为2

若范围与间隔不匹配,取到的切片为空

5.逻辑运算符与c语言不同

c语言中与、或、非分别为&&||! 而py中为andornot 其他的比如==, >>= ,!=比较运算符相同

6.python中的三目运算符

python中没有其他语言中的三元表达式,不过有类似的实现方法 c++中三目运算符:

python中只有类似的替代办法,将if-else语句嵌套在赋值语句中:

7.C++中的NULL,在Python中为None

None是一种特殊数据类型

在判断表达式中,均为False:

输出:f is False

8.if判断语句为真或者假的情况:

判断为True:只要x是非零数值(正数、负数)、非空字符串、非空list等(即为非None) 判断为False:数值0(包括负0:-0)和None、空字符串、空list等:

9.二维数组的创建和初始化

首先介绍下*运算,对于一个整数,*表示乘法运算:

对于字符串和列表,*进行了重载,表示重复:

需要注意,若要构造嵌套列表,需要加上[]

由此引出二维数组的第一种创建方式: 创建5*6的矩阵,初始为0

终极简化版:

第二种方式:列表推导式先在[]中用for循环创建一个list,在外层[]继续用for循环创建list

或者写作:

什么是列表推导式:

然而实际使用时发现,第一种方式创建的二维数组,列方向上的元素会集体改变:

因此若二维数组之后还需使用的话,外层不能用*的方法构建,可以改为:

第三种方法:

10.in运算符还有对应的not in运算符

in运算符可以用于判断字符串是否包含另一个字符串,返回的是布尔值 同理not in可以用来判断字符串是否不包含另一个字符串,返回也是布尔值 因此没必要先用in然后在表达式前面加not了,直接not in。

11.py中的for循环内改变循环变量(i),并不会改变循环次数,而c++会改变次数。此外循环范围也不能改变(start,end)

看下面C++代码:

输出:

可以看到在i==2时,i增加了1,下一次for循环i加1,因此直接从4开始,跳过了i==3。循环只执行了9次! 而类似的py代码中:

输出:

可以看到循环依然执行了10次,即i==2时虽然i增加1,但是下一次for循环依然从i=3执行。

结论:py中对for循环变量的修改不会影响到for的循环次数,也就是说,对循环变量的修改只在当前轮次内有效,不影响下一个循环

若要对循环变量进行修改,且下一轮仍有效,应该使用while循环。

对循环范围修改也是无效的,应改用while: https://blog.csdn.net/u012033124/article/details/79080631

12. py中的多变量for循环(使用zip打包)

c++中有如下形式:

输出:

py中:

可以看到c++与py的区别,当某一个变量到达终点时,py全部停止,而c++是继续,直到所有变量到达终点。

在这一题中有用到: https://blog.csdn.net/u012033124/article/details/80695353

13.列表表达式

顾名思义,列表(list)表达式包含一个list 详见:https://www.cnblogs.com/yupeng/p/3428556.html

14.解包**(符号:*

https://blog.csdn.net/pfm685757/article/details/50464426

以上两点再这道题目第二种解法中展现得淋漓尽致: https://blog.csdn.net/u012033124/article/details/80515131

15.and or表达式的进一步理解

实际上是起到一个“短路”的作用 and:从左到右扫描,返回第一个为的表达式值,无假值则返回最后一个表达式值。

or:从左到右扫描,返回第一个为的表达式值,无真值则返回最后一个表达式值(因为真值是非0值,所以无真值一般只有全0的情况,返回假)。

https://blog.csdn.net/niuniuyuh/article/details/71213887

16.list(或tuple)之间的比较是字典序的:

先比较第一个元素,谁的大相应的list就大;相等则比较第二个元素,以此类推。。。

因此按字典排序(第一位比第二位重要,第二位比第三位重要。。。),可以在sorted函数中的key参数使用lambda表达式:

在这一题中有使用: https://blog.csdn.net/u012033124/article/details/79099404

17.多个lambda式的写法

https://cai-sen-se.gitbook.io/leetcode/150.-ni-bo-lan-biao-da-shi-qiu-zhi 实质上是用了字典,将四个lambda表达式作为值,四种运算符号作为键。

18.list转dict

list转map需要每个元素都为长度2的子list,转dict后第0个元素为key,第1个元素为value

若有元素长度不符合:

见 https://cai-sen-se.gitbook.io/leetcode/601-800/732.-wo-de-ri-cheng-an-pai-biao-iii

19.dict初始化

dict的key没有默认对应value(不像c++),因此遇到第一次出现的key时往往需要特殊处理 详见: https://cai-sen-se.gitbook.io/leetcode/~/edit/drafts/-Lav6nf8yvGNZMaYIw4t/601-800/609.-zai-xi-tong-zhong-cha-zhao-zhong-fu-wen-jian

20.二进制表示

c语言中是用补码,而py中使用原码加正负号表示:

21.可哈希和不可哈希的类型

总结: (1)list、set、dict:是不可哈希的 (2)int、float、str、tuple:是可以哈希的 (3)list 不使用 hash 值进行索引,故其对所存储元素没有可哈希的要求;set / dict 使用 hash 值进行索引,也即其要求欲存储的元素有可哈希的要求。 (4)dict 仅对键(key)有可哈希的要求,对值(value)无此要求。

49题解法一用到 https://app.gitbook.com/@cai-sen-se/s/leetcode/1-200/49.-zi-mu-yi-wei-ci-fen-zu

22.map函数

map() 会根据提供的函数对指定序列做映射。

https://www.runoob.com/python/python-func-map.html 若function为基本数据类型(如int): 则将iterable中所有元素转为int 例如键盘输入5 19,读取并转换为两个整数:

23.集合(set)

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。 使用for表达式创建集合:

或不用for,直接range:

24.python set运算操作

对两个集合(set)的运算操作有差集(-)、交集(&)和并集(|):(注意没有加) 差集:

交集并集:

25.统计词频

方法一(直观):

https://app.gitbook.com/@cai-sen-se/s/leetcode/1-200/76.-zui-xiao-fu-gai-zi-chuan#jie-fa-yi 方法二(简洁):用get()

26.全局变量关键字global和nonlocal

函数调用外部变量,要在外部变量声明时函数内部使用时,都声明global

或者只在内部使用时,声明nonlocal

最后更新于