本文对于菜鸟联盟python3教程中的一些难点和易错点进行了总结。
Python3 教程 | 菜鸟教程www.runoob(一)基础语法
1.标识符
标识符由字母、数字、下划线组成,但不能以数字开头;区分大小写;
以下划线开头的标识符是有特殊意义的。以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入;
以双下划线开头的 __foo 代表类的私有成员,以双下划线开头和结尾的 __foo__ 代表 Python 里特殊方法专用的标识:如 __init__() 代表类的构造函数。
2.字符串
三引号( ''' 或 """ ) 来表示字符串,也可用来多行注释;
反斜杠可以用来转义,使用r可以让反斜杠不发生转义,如 r"this is a line with n" 则n会显示,并不是换行;
Python中的字符串本身不能改变,但可以重新赋值,比如word[0] = 'm'会导致错误。
3.输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""。
4.导入
将整个模块导入,例如:import time,在引用时格式为:time.sleep(1);
将整个模块中全部函数导入,例如:from time import *,在引用时格式为:sleep(1);
将模块中特定函数导入,例如:from time import sleep,在引用时格式为:sleep(1);
将模块换个别名,例如:import time as t,在引用时格式为:t.sleep(1)。
导入包的子模块,例如:import sound.effects.echo/from sound.effects import echo(二者引用时的格式不同)
(二)基本数据类型
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
1.数值计算
数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数;
在混合计算时,Python会把整型转换成为浮点数。
2.列表
列表截取可以接收第三个参数,参数作用是截取的步长,如果第三个参数为负数表示逆向读取。
例:反转字符串
def reverseWords(input):
# 通过空格将字符串分隔符,把各个单词分隔为列表
inputWords=input.split(" ")
inputWords=inputWords[-1::-1]
# 重新组合字符串
output=' '.join(inputWords)
return output
3.元组
元组的元素不可改变,但它可以包含可变的对象,比如list列表;
构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
一般函数的返回值为一个,而函数返回多个值的时候,是以元组的方式返回的;
def example(a,b):
return (a,b) #返回元组
def example(a,b):
return [a,b] #返回列表,此时返回值只有一个
python中的函数还可以接收可变长参数,比如以 "*" 开头的的参数名,会将所有的参数收集到一个元组上:
def test(*args):
return args
>>>test(1,2,3,4) #会返回一个元组
4.集合
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典;
集合是无重复元素的序列,会自动去除重复元素;
集合是无序的,所以不支持索引。
5.类型转换
chr(x) 将一个整数转换为一个字符
ord(x) 将一个字符转换为它的整数值
type() 是用于求一个未知数据类型对象,而 isinstance()是用于判断一个对象是否是已知类型;
**type() 不认为子类是父类的一种类型,而isinstance()会认为子类是父类的一种类型,因此type 主要用于判断未知数据类型,isinstance()主要用于判断A类是否继承于B类。
>>> isinstance(B(), A)
True
>>> type(B()) == A
False
(三)运算符
1.成员运算符 in/not in
2.身份运算符
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
*python 没有自增运算符,正确的自增操作应该 a = a + 1 或者 a += 1。
(四)数据类型详解
1.随机数
头文件:import random
choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
shuffle(lst) 将序列的所有元素随机排序
2.字符串
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串:
s1 = "-"
s2 = ""
seq = ("r", "u", "n", "o", "o", "b") # 字符串序列
print (s1.join( seq ))
print (s2.join( seq ))
结果:
r-u-n-o-o-b
runoob
3.列表
append()每次只能添加一个值,extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
4.元组
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象:
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
5.集合
s.discard( x )也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:
在交互模式中,pop 是删除集合的第一个元素(排序后的集合的第一个元素);在脚本模式,则随机删除集合中的一个元素。
(五)基本语句
1.循环
while … else 在条件语句为 false 时执行 else 的语句块;
break 语句可以跳出循环体,如果从循环中终止,任何对应的循环 else 块将不执行。
2.迭代器与生成器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退;
迭代器有两个基本的方法:iter() 和 next():
>>>list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() ;
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行;
调用一个生成器函数,返回的是一个迭代器对象;
例:使用 yield 实现斐波那契数列
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f是一个迭代器,由生成器返回生成
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
3.函数
加了两个星号 ** 的参数会以字典的形式导入;
加了星号 * 的参数会以元组的形式导入,存放所有未命名的变量参数;
声明函数时,参数中星号 * 可以单独出现;如果单独出现星号 ,* 后的参数必须用关键字传入:
>>> def f(a,b,*,c):
... return a+b+c
...
>>> f(1,2,3) # 报错
>>> f(1,2,c=3) # 正常
6
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字;
*匿名函数 lambda:
x = lambda arg1, arg2: arg1 + arg2
·lambda 只是一个表达式,函数体比 def 简单很多;
·lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去;
·lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数;
·虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
*map()函数:
·map() 会根据提供的函数对指定序列做映射;
·第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
>>>def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5])
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])
[1, 4, 9, 16, 25]
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
更多推荐
输入n输出n个星号 python_python基础教程难点
发布评论