Python基础学习

来源:互联网 发布:linux yum安装jdk1.7 编辑:程序博客网 时间:2024/06/14 21:44

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 linethis is second linethis is third line''')
  • 可用 + 连接两个字符串,用 * 表示字符串的重复。
print(3 * 'AB')'ABABAB'
  • 相邻的字符串文本会自动连接到一起,但仅限于字符串文本,表达式不行。
'py' 'thon''python'
  • Python没有字符类型,字符就是最简单的字符串。字符串可以被索引,被切片。
word = pythonword[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填充
      1. 以上如果字符串实际长度过长会原样输出,不会截断。
  • 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传入)。