本文对于菜鸟联盟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基础教程难点