Python随学随记(1)

来源:互联网 发布:groovy 数组 编辑:程序博客网 时间:2024/05/21 21:37

直接运行python文件

在Windows上是不行的,但是在Mac和Linux上是可以的
方法是在.py文件的第一行加上一个特殊的注释.

 #!/usr/bin/env python3

按utf-8编码读取

#!/usr/bin/env python3#-*- coding: utf-8 -*-

编译器、解释器(简单理解)

它们是负责把符合语法的程序代码转换成CPU能够执行的机器码,然后执行
解释器是一条一条的解释执行源语言
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,速度快.

十六进制的前缀

十六进制用0x前缀和0-9 a-f表示

浮点数

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,
一个浮点数的小数点位置是可变的,比如,1.23x10^9和12.3x10^8是完全相等的
浮点数可以用数学写法,但对于很大或很小的浮点数就必须用科学记数法 用e代替10.

如何使字符串不转义

在’(单引号)、”(双引号)、”’(三引号)前加r 如:

>>> print r"\t\t\t" \t\t\t

特殊的空值

None 不是0, 因为0是有意义的

静态语言

静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错.

常量

常量就是不能变的变量 通常用全部大写的变量名来表示常量.

chr()、unichr()和ord()

ord( ):接受一个参数 返回单字符在ASCII中对应的整数
chr( ):与ord()相反,返回参数所对应的ASCII字符
unichr( ):与chr( )一样 只不过返回的是unicode字符
- chr是character的缩写,即字符
- ord是unicode ordinal的缩写,即编号
- 但是由于chr局限于ascii,长度只有256,于是又多了个unichr.
- 在bytes中,无法显示为ASCII字符的字节,用\x##显示

常见占位符

%c 转换成字符(ASCII 码值,或者长度为一的字符串)
%r 优先用repr()函数进行字符串转换(Python2.0新增)
%s 优先用str()函数进行字符串转换
%d/%i 转成有符号十进制数
%u 转成无符号十进制数
%o 转成无符号八进制数
%x / %X(Unsigned) 转成无符号十六进制数(x / X 代表
转换后的十六进制字符的大小写)
%e / %E转成科学计数法(e / E控制输出e / E)
%f / %F转成浮点数(小数部分自然截断)
%g / %G 是%e和%f / %E和%F 的简写
%% 输出%
其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数

>>> '%2d-%02d' % (3, 1)' 3-01'>>> '%.2f' % 3.1415926(%后面的点是关键)'3.14'

要避免key不存在的错误,有两种办法

一是通过in判断key是否存在:

>>> 'Thomas' in dFalse

二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('Thomas')>>> d.get('Thomas', -1)-1

list和dict的比较

  • dict:
    • 查找和插入的速度极快,不会随着key的增加而增加
    • 需要占用大量的内存,内存浪费多
    • 正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象.
  • list:*重点内容*
    • 查找和插入的时间随着元素的增加而增加
    • 占用空间小,浪费内存很少.

cmp(x,y) 函数

用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1.

print "cmp(39, 232) : ", cmp(39, 232)cmp(39, 232) : -1

函数部分易错点

定义函数时,需要确定函数名和参数个数
如果有必要,可以先对参数的数据类型做检查
函数体内部可以用return随时返回函数结果
函数执行完毕也没有return语句时,自动return None
函数可以同时返回多个值,但其实就是一个tuple
定义默认参数要牢记一点:默认参数必须指向不变对象.

在参数前加一个*

  • 就可以把函数的参数改为可变参数, 调用该函数时,可以传入任意个参数,包括0个参数

  • 在Python中定义函数,可以用必选参数默认参数可变参数关键字参数.

  • 通过一个tupledict,你也可以调用该函数,所以对于任意函数,都可以通过类似
    func(*args, **kw)的形式调用它,无论它的参数是如何定义的.

参数部分易错点

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数
默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!
- 要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple
**kw是关键字参数,kw接收的是一个dict
- 以及调用函数时如何传入可变参数关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func({**'a': 1, 'b': 2}).
使用*args**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法.

尾递归优化

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的.

def fact(n):    return fact_iter(n, 1)def fact_iter(num, product):    if num == 1:        return product    return fact_iter(num - 1, num * product)>>> fact_iter(5, 1)>>> 120

可以看到,return fact_iter(num - 1, num * product)仅返回递归函数本身,num - 1num * product在函数调用前就会被计算,不影响函数调用。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出.

学习资料Python 2.7教程 - 廖雪峰

0 0