Python基础知识

By | 2017年8月30日

Python的一些基本语法,总结了下集中在这里,还会慢慢增加的。

1. 文件开头的写法

  • Python和普通的脚本程序一样,开头必须说明解释器的种类,尤其在Linux中,必须指明解释器的位置,通常的写法是:
#!/bin/usr/python3
#!/bin/usr/env python3 

其中env指的是环境变量,chmod +x 文件名给予文件执行权限.
- Python开头也应该指明源文件的编码类型,默认也是UTF-8。

# -*- coding: encoding -*-

2. 内存管理

Python不需要程序员进行内存管理,解释器会自动负责。

3. 解释型和编译性

Python是解释性语言,但也可以被编译成类似字节码的形式来加快运行速度。

4. Python编译指令

python -d提供调试输出
python -O生成优化的字节码(生成.pyo文件)
python -S不导入site模块以在启动时查找Python的路径
python -m mod将一个模块以脚本形式运行
python file从给定的文件运行Python脚本

5. Python的不同版本

  • Python的C实现叫CPython
  • Python的Java实现叫Jython:只要有Java虚拟机,就可以运行Jython,它拥有访问Java包和类库的能力,利用的是Java原生的垃圾收集器(CPython未实现此功能)。

6. Python函数

  • 未指定返回值的函数自动返回None,等价于NULL。

7. 交互模式下编程

>>>主提示符,开始指令的输入
...从属提示符,换行后继续下一个指令的输入

8. 数值的计算

  • /永远会返回一个浮点数,需要整除要用//,需要乘方要用**,一个计算式中只要有浮点数结果就会用浮点数表示。
  • 最近一个表达式的值会赋给下划线符号_,且它是只读的。
  • 支持复数,用j或J表示,例如3+5j

9. 字符串的使用

  • 单引号和双引号作用一样,不区分
  • 要在引号中使用反斜杠本身而不是转义作用时,要用\\双反斜杠,或者在第一个引号前面加小写r。
  • 使用三引号(不区分单双)可在多行编辑字符串,后接反斜杠表示下一行的开头接着本行末尾,也即没有换行符号。
print('''\
    This is first line
    this is second line
    this is third line
    ''')
  • 可用 + 连接两个字符串,用 * 表示字符串的重复。
print(3 * 'AB')
'ABABAB'
  • 相邻的字符串文本会自动连接到一起,但仅限于字符串文本,表达式不行。
'py' 'thon'
'python'
  • Python没有字符类型,字符就是最简单的字符串。字符串可以被索引,被切片。
word = python
word[0]
'p'
word[-1]
'n'
word[0,2]  #包括起始字符,不包含末尾字符
'py'
word[:2] + word[2:]  #永远等于word
'python'
#开头省略的索引默认为0,结尾省略的默认为字符串大小(个数)
  • len()返回字符串的长度

10. 循环体的判断条件

  • 所有非零整数都是true,0为false。若是序列则非空为true,空则为false。

11. for循环迭代

  • 在循环迭代过程中修改迭代的序列是不安全的,可以迭代它的复本,然后修改原序列。
words = ['cat','dog','pig']
for animal in words[:]:  #words[:]是复本
    if len(animal) > 2:
        words.insert(0, animal)  #这里的words是原序列变量
  • range(start, end, step):起始值,结束值(不包括),步进值。
  • for函数:迭代器;range函数:可迭代的;list函数:迭代器;
  • for循环后可以有一个else语句,表示本次循环正常结束(没有被break)时执行。

12. print函数

  • 默认是自动换行的,使用print(var, end='')可以规定输出以什么结尾。

13. 函数的定义

  • 结构
def fib(n):  #函数名
"""打印一个斐波那契数列"""     
#这是文档字符串,介绍函数的功能,可以根据它自动生成文档,也叫docstring
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
        print()
  • 函数可以任意改名,使用方式不变,这在导包时很有用,可以给名字过长的函数取一个短的名字,使用起来更方便。
f = fib
f(10)  #效果和fib(10)相同
  • 函数的形参可以有默认值,在使用函数的时候,没有默认值的一定要传参,有默认值的可以省略不传参.函数还可以通过“关键字参数”来调用,如:
def parrot(voltage, state='a stiff', action='voom', type='Chinese Red'):
    parrot(1000)
    parrot(voltage=1000)
    parrot(voltage=1000, action='VoooM')
    parrot(1000, action='test')

注意:
1. 在定义函数时,某项形参有默认值,后面的形参必须都有默认值。
2. 使用时,没有默认值的必须传入参数。
3. 使用关键字时,参数的位置没有影响,parrot(voltage=1000, action='VoooM')parrot(action='VoooM', voltage=1000)效果相同
4. 传参时没有指定关键字,则从前往后匹配,若带关键字则位置必须在不带关键字的后面。

  • 函数形参中可以有元组和字典
def student(name, *subject, **grade):
# *subject 表示一个元组 **grade 表示一个字典

元组或字典做参数,也叫可变参数。元组和字典前面可以有普通位置参数,后面只能有关键字参数。传入的普通参数值,匹配完位置参数后,多余的会进入元组,即所谓的可变参数。字典有其独特的传参格式,这里先不谈。

  • 列表、元组和字典都可以作为单个参数传入函数中
def student(name, sex='girl', age=25):
    print(name, sex, age)
    stu1 = ('shengbo', 'boy', 23)
    stu2 = ['shengbo', 'boy', 23]
    stu3 = {'name':'shengbo', 'sex':'boy', 'age':23}
    student(*stu1)
    student(*stu2)
    student(**stu3)
    # 输出结果
    shengbo boy 23
    shengbo boy 23
    shengbo boy 23
  • Lambda形式的函数:这里先不谈。

14. 列表的使用

  • 增加
    • list.append(x):将x添加到列表末尾
    • list.insert(i,x):将x插入到位置i
    • list.extend(L):将列表L整个加到本列表后面
  • 删除
    • list.remove(x):删除列表中值为x的第一个元素,没有则返回错误
    • list.pop(i):从位置i删除元素并范围其值,如果未指定i则删除并返回最后一个元素
    • list.clear():删除列表中所有元素
  • 其他
    • list.index(x):返回列表中第一个值为x的元素的索引
    • list.count(x):返回x在列表中出现的次数
    • list.sort():对列表就地进行排序
    • list.copy():返回列表的浅拷贝
    • list.reverse():就地倒排列表中的元素
  • del:没有返回值
    • del a[1]:删除列表a中索引为1的元素
    • del a[2:4]:删除列表a中索引为2、3的元素
    • del a:删除变量a
    • del a[:]:清空列表a
  • 循环
for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)

15. 元组

  • 创建空元组:a = ()
  • 创建仅包含一个元素的元组:a = ('hello',)
  • 元组可以用来给变量赋值:
a = (1, 2, 3)
x, y, z = a

16. 字典

  • 构造
    • a = {'cat':123, 'dog':456, 'pig':789}
    • a = dict(cat=123, dog=456, pig=780)
      关键字必须都是简单字符串
  • 循环
    • 可用items()同时对键和值循环:
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
    for k, v in knights.items():
        print(k, v)

17. 格式化输出

  • 数值转为字符串
    • str():转化为适合人阅读的形式
    • repr():转为为供解释器读取的形式,即\r\n等符号不会生效
  • 字符串类常用函数
    • str.ljust(x):字符串占x列,左对齐,右填充
    • str.rjust(x):字符串占x列,右对齐,左填充
    • str.center(x):字符串占x列,居中对齐,两边填充
    • str.zfill(x):字符串占x列,右对齐,左边用0填充
以上如果字符串实际长度过长会原样输出,不会截断。
  • str.format()函数
    print('we are the {} who say {}'.format('knights','NI'))
    >>>we are the knights who say NI
    print('{1} {0}'.format('chicken', 'egg'))
    >>>egg chicken
    print('The {food} is {acjective}'.format(food='spam','acjective=horribe'))
    >>>The spam is horribe
    number = {'one':'one','two':'two','three':'three'}
    print('one:{one};two:{two};three:{three}'.format(**number)、

Tip:

  1. str.format()左右两边相当于是函数,会把右边的值传给左边,左边用{}花括号表示一个形参。
  2. 和函数一样,左边的形参支持位置参数:在花括号中加数字;支持关键字参数:右边赋值时也要加关键字;也支持字典的整体导入。

18. 变量作用域

  • 变量默认是local类型的,即局部的,这个局部跟变量所处位置有关,在函数里定义的就是仅作用在函数内部,在模块中定义的就作用于整个模块。使用nonlocal在变量前面修饰可使变量跳出当前作用域也在下一层空间起作用,例如函数中定义了函数,在内函数使用nonlocal修饰变量可使变量在外函数中也起作用。global修饰的是全局变量,即变量在整个最大的外层空间都起作用。

19. 导包问题

  • 标准模块包可以直接导入对应的.py文件,自定义的包或.py文件要导入貌似路径要加上最大的外层包名。

20. 类的使用

  • 类的定义:
    class ChildClass(ParentClass):
        <statement-1>
        ...
        <statement-N>

Tip:
1. Python有限地支持多继承,语法为class MyClass(Base1, Base2, Base3):,可以使用super()来动态改变解析顺序,具体使用方法还不知道。

  • 类的实例化:
    x = MyClass()
  • 类的初始化:
    class MyClass:
    var = 'global'
    def __init__(self, name='shengbo', sex='boy', age='0'):
        self.name = name
        self.sex = sex
        self.age = age

Tip:
1. 类中定义的函数都默认有参数self,表示当前实例。
2. 在__init__中初始化的都是实例变量,在类里面函数外面定义的都是类变量。初始化函数有无参数都行。
3. 类中任何函数中定义的带有self的变量都是实例变量,都可以被直接访问,但不能在函数外定义带有self的实例变量,只能定义不带self的类变量。
4. 类实例化后,还可以直接给实例加新的实例变量。例如上述MyClass类,虽然没有事先定义名为“ID”的实例变量,但可以直接赋值x.ID = 1,后面可以用del x.ID来删除该变量。
5. 根据上述特性,可以使用一个空类来实现一种特殊的抽象数据结构。
- Python几乎无法做到隐藏数据对象
- 关于Python中的私有变量
- 关于Python类的迭代器、生成器和生成器表达式

21. 基本编码风格

  • 命名:
    1. 模块名必须简短且用小写字母
    2. 类名用驼峰写法——简写且大写首字母,缩略词如HTTP均大写
    3. 函数和变量名均用小写字母且用单下划线分隔
    4. 常量名全大写并用单下划线分隔
    5. 函数和变量名加单下划线前缀可以避免导包时被导入(non-public),加双下划线前缀可以避免继承时和子类名字冲突(自动加了前缀_类名进行混杂)。

22. 不确定参数

  1. 函数形式为function(self, *args, **kwargs),表示参数个数不确定,可以有大于等于零个位置参数(从*args传入),也可以有大于等于零个关键字参数(从**kwargs传入)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注