Python 基础

Posted by Will on March 31, 2019

“walk beside you ”

前言

  事出总是突然的,而理由则是后来加上去的。 —— 佩恩


正文

  Python作为自己第二开发语言,时常会有一些语法记不起来(还是不经常使用。。。。)。这里记录下基础语法。。。

基础语法

编码

默认情况下,Python3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码:

# -*- coding: utf-8 -*-

注释

  • 单行注释 注释

  • 多行注释

    '''
    注释
    注释
    '''
    或
    """
    注释
    注释
    """

数字(Number)类型

  • int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
  • bool (布尔), 如 True。
  • float (浮点数), 如 1.23、3E-2
  • complex (复数), 如 1 + 2j、 1.1 + 2.2j

字符串(String)

  • python中单引号和双引号使用完全相同。 "123" '123'

  • 使用三引号(‘'’或””“)可以指定一个多行字符串。

  • 转义符 ‘'

  • 反斜杠可以用来转义,使用r可以让反斜杠不发生转义。。 如 r”this is a line with \n” 则\n会显示,并不是换行。

  • 按字面意义级联字符串,如”this “ “is “ “string”会被自动转换为this is string。

  • 字符串可以用 + 运算符连接在一起,用 * 运算符重复。

  • Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。

  • Python中的字符串不能改变。

  • Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。

  • 字符串的截取的语法格式如下:变量[头下标:尾下标:步长]

#!/usr/bin/python3
 
str='0123456'
 
print(str)                 # 输出字符串
print(str[0:-1])           # 输出第一个到倒数第二个的所有字符
print(str[0])              # 输出字符串第一个字符
print(str[2:5])            # 输出从第三个开始到第五个的字符
print(str[2:])             # 输出从第三个开始后的所有字符
print(str[1:5:2])          # 输出从第二个开始到第五个且每隔两个的字符
print(str * 2)             # 输出字符串两次
print(str + '789')         # 连接字符串

用户输入

input

input("\n\n按下 enter 键后退出。")

print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=”“:

 print( 1 )
 print( 2 )

 print( 3, end=" " )
 print( 4, end=" " )

列表

索引

列表索引从 0 开始,第二个索引是 1,依此类推。 索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推。


list = [1,2,3,4,5]
print( list[1] )
print( list[2] )
print( list[-1] )
print( list[-2] )

输出
2
3
5
4

使用方括号 [] 的形式截取字符


list = [1,2,3,4,5]
print( list[1:3] )

输出

[2,3,4]

更新列表

可以对列表的数据项进行修改或更新,你也可以使用 append() 方法来添加列表项

 
list = [1,2,3,4]
 
list[2] = 222

list.append(5)

删除列表元素

del list[1]

函数&方法

  • 函数
  1. len(list) 列表元素个数
  2. max(list) 返回列表元素最大值
  3. min(list) 返回列表元素最小值
  4. list(seq) 将元组转换为列表
  • 方法
  1. list.append(obj) 在列表末尾添加新的对象
  2. list.count(obj) 统计某个元素在列表中出现的次数
  3. list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
  4. list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
  5. list.insert(index, obj) 将对象插入列表
  6. list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
  7. list.remove(obj) 移除列表中某个值的第一个匹配项
  8. list.reverse() 反向列表中元素
  9. list.sort( key=None, reverse=False) 对原列表进行排序
  10. list.clear() 清空列表
  11. list.copy() 复制列表

元组

元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号 ( ),列表使用方括号 [ ]

字典

字典是另一种可变容器模型,且可存储任意类型对象。好比 Java 的Map 字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中。 键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字。

函数&方法

  • 函数
    1. len(dict) 计算字典元素个数,即键的总数

    2. str(dict) 输出字典,以可打印的字符串表示

    3. type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型

  • 方法
    1. radiansdict.clear() 删除字典内所有元素
    2. radiansdict.copy() 返回一个字典的浅复制
    3. radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
    4. radiansdict.get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值
    5. key in dict 如果键在字典dict里返回true,否则返回false
    6. radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组
    7. radiansdict.keys() 返回一个迭代器,可以使用 list() 来转换为列表
    8. radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
    9. radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里
    10. radiansdict.values() 返回一个迭代器,可以使用 list() 来转换为列表
    11. pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
    12. popitem() 随机返回并删除字典中的最后一对键和值

集合

集合(set)是一个无序的不重复元素序列。 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

方法

  1. add() 为集合添加元素
  2. clear() 移除集合中的所有元素
  3. copy() 拷贝一个集合
  4. difference() 返回多个集合的差集
  5. difference_update() 移除集合中的元素,该元素在指定的集合也存在。
  6. discard() 删除集合中指定的元素
  7. intersection() 返回集合的交集
  8. intersection_update() 返回集合的交集。
  9. isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
  10. issubset() 判断指定集合是否为该方法参数集合的子集。
  11. issuperset() 判断该方法的参数集合是否为指定集合的子集
  12. pop() 随机移除元素
  13. remove() 移除指定元素
  14. symmetric_difference() 返回两个集合中不重复的元素集合。
  15. symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
  16. union() 返回两个集合的并集
  17. update() 给集合添加元素

迭代器与生成器

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

字符串,列表或元组对象都可用于创建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

迭代器对象可以使用常规for语句进行遍历:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。 __next__() 方法会返回下一个迭代器对象。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。 在 20 次迭代后停止执行:

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
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。 调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:


#!/usr/bin/python3
 
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()


0 1 1 2 3 5 8 13 21 34 55

File

open() 方法 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError 注意: 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode) open(file, mode='r')

完整的语法格式为: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

mode 参数有:

  • t: 文本模式 (默认)。
  • x: 写模式,新建一个文件,如果该文件已存在则会报错。
  • b: 二进制模式。
  • +: 打开一个文件进行更新(可读可写)。
  • U: 通用换行模式(Python 3 不支持)。
  • r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
  • rb: 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
  • r+: 打开一个文件用于读写。文件指针将会放在文件的开头。
  • rb+: 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
  • w: 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
  • wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
  • w+: 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
  • wb+: 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
  • a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
  • ab: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
  • a+: 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
  • ab+: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

file 对象

  1. file.close() 关闭文件。关闭后文件不能再进行读写操作。

  2. file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

  3. file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

  4. file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。

  5. file.next() Python 3 中的 File 对象不支持 next() 方法。返回文件下一行。

  6. file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。

  7. file.readline([size]) 读取整行,包括 “\n” 字符。

  8. file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

  9. file.seek(offset[, whence]) 移动文件读取指针到指定位置

  10. file.tell() 返回文件当前位置。

  11. file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。

  12. file.write(str) 将字符串写入文件,返回的是写入的字符长度。

  13. file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

OS 模块

  1. os.access(path, mode) 检验权限模式
  2. os.chdir(path) 改变当前工作目录
  3. os.chflags(path, flags) 设置路径的标记为数字标记。
  4. os.chmod(path, mode) 更改权限
  5. os.chown(path, uid, gid) 更改文件所有者
  6. os.chroot(path) 改变当前进程的根目录
  7. os.close(fd) 关闭文件描述符 fd
  8. os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略
  9. os.dup(fd) 复制文件描述符 fd
  10. os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2
  11. os.fchdir(fd) 通过文件描述符改变当前工作目录
  12. os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。
  13. os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。
  14. os.fdatasync(fd) 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。
  15. os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象
  16. os.fpathconf(fd, name) 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
  17. os.fstat(fd) 返回文件描述符fd的状态,像stat()。
  18. os.fstatvfs(fd) 返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。
  19. os.fsync(fd) 强制将文件描述符为fd的文件写入硬盘。
  20. os.ftruncate(fd, length) 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。
  21. os.getcwd() 返回当前工作目录
  22. os.getcwdb() 返回一个当前工作目录的Unicode对象
  23. os.isatty(fd) 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。
  24. os.lchflags(path, flags) 设置路径的标记为数字标记,类似 chflags(),但是没有软链接
  25. os.lchmod(path, mode) 修改连接文件权限
  26. os.lchown(path, uid, gid) 更改文件所有者,类似 chown,但是不追踪链接。
  27. os.link(src, dst) 创建硬链接,名为参数 dst,指向参数 src
  28. os.listdir(path) 返回path指定的文件夹包含的文件或文件夹的名字的列表。
  29. os.lseek(fd, pos, how) 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算;. os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 30. os.lstat(path) 像stat(),但是没有软链接
  30. os.major(device) 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。
  31. os.makedev(major, minor) 以major和minor设备号组成一个原始设备号
  32. os.makedirs(path[, mode]) 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。
  33. os.minor(device) 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。
  34. os.mkdir(path[, mode]) 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。
  35. os.mkfifo(path[, mode]) 创建命名管道,mode 为数字,默认为 0666 (八进制)
  36. os.mknod(filename[, mode=0600, device]) 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。
  37. os.open(file, flags[, mode]) 打开一个文件,并且设置需要的打开选项,mode参数是可选的
  38. os.openpty() 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。
  39. os.pathconf(path, name) 返回相关文件的系统配置信息。
  40. os.pipe() 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写
  41. os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道
  42. os.read(fd, n) 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
  43. os.readlink(path) 返回软链接所指向的文件
  44. os.remove(path) 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。
  45. os.removedirs(path) 递归删除目录。
  46. os.rename(src, dst) 重命名文件或目录,从 src 到 dst
  47. os.renames(old, new) 递归地对目录进行更名,也可以对文件进行更名。
  48. os.rmdir(path) 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
  49. os.stat(path) 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。
  50. os.stat_float_times([newvalue]) 决定stat_result是否以float对象显示时间戳
  51. os.statvfs(path) 获取指定路径的文件系统统计信息
  52. os.symlink(src, dst) 创建一个软链接
  53. os.tcgetpgrp(fd) 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组
  54. os.tcsetpgrp(fd, pg) 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。
  55. os.tempnam([dir[, prefix]]) Python3 中已删除。返回唯一的路径名用于创建临时文件。
  56. os.tmpfile() Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。
  57. os.tmpnam() Python3 中已删除。为创建一个临时文件返回一个唯一的路径
  58. os.ttyname(fd) 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。
  59. os.unlink(path) 删除文件路径
  60. os.utime(path, times) 返回指定的path文件的访问和修改的时间。
  61. os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。
  62. os.write(fd, str) 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度
  63. os.path 模块 获取文件的属性信息。
  64. os.pardir() 获取当前目录的父目录,以字符串形式显示目录名。