MyException - 我的异常网
当前位置:我的异常网» Perl/Python » Python学习笔记(1)

Python学习笔记(1)

www.MyException.Cn  网友分享于:2015-02-03  浏览:0次
Python学习笔记(一)
一、基本语法
1、raw_input()取的内容永远以字符串的形式返回
2、“”和’'的一个区别是
     “This’s a test!” √
     ’This’s a test!’ ×
     'This\'s a test!' √
3、在if或者for后,如果需要接代码块,加上:,并且换行,代码每行开始都需要Tab缩进,或者以四个空格代替缩进
4、一个函数的定义如下:
def printHello():
     print "Hello"
5、函数可以有多个返回值
def getNewPoint(x, y):
     nx = x + 1
     ny = y + 1
     return nx, ny
x, y = getNewPoint(1, 2)
其实看似是直接允许有多个返回值,但实际上返回的是一个tuple,语法上返回一个tuple可以省略括号,多个变量可以同时接收一个tuple,按照位置付给对应的值。
6、如果有代码块暂时没有想好怎么写,如函数,或者if结果,可以用pass代替,以防报错,如:
def nop():
     pass
7、由于变量并没有固定的数据类型,所以如果函数有需求固定参数类型需要指定,如:
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x
8、函数支持默认参数,但是必选参数需要在前面,默认参数在后面。并且默认参数必须是不变对象,如果是List,List内的值会记住上次调用的值。
def add_end(L=[]):
    L.append('END')
    return L ×
def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L √
9、可变参数,允许传入多个,甚至0个参数,接收的时候会自动转变为一个tuple。
def calc(*numbers):
     sum = 0
     for n in number:
          sum = sum + n
     return sum
如果已经有了list或者tuple,在调用的时候:
calc(nums[0], nums[1], nums[2]) √
calc(*nums)
10、关键字参数,与可变参数类似,但是接收的时候自动转为的是dict而不是tuple
def person(name, age, **kw):
    print 'name:', name, 'age:', age, 'other:', kw
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
类似于可变参数,如果已有一个dict,需要传参,可以在前面加**调用
11、定义函数的时候,如果需要一起使用四种参数,顺序必须是:
必选参数、默认参数、可变参数、关键字参数
def func(a, b, c=0, *args, **kw):
    print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
>>> func(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> func(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> func(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> func(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
12、Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
13、tuple和list一样,都是有序列表,但是tuple不可变,定义list用[],定义tuple用()


二、高级特性
1、切片,快速取出list中指定范围数据(tuple也是一种list,字符串也可以看做一种list)
list[a:b:c] a是起始位置,b是结束位置(不包含),c可有可无,间隔数
三个参数都可以省略,a默认为0,b默认为len(list),c默认为1
2、迭代
dict = {'one':1, ’two':2}
for key in dict:
     pass
这样迭代出来的只有key,如果需要迭代key和value,那么:
for key, value in dict.iteritems():
     pass
判断一个对象是否为可迭代对象:
from collections import Iterable >>> isinstance('abc', Iterable):
     pass
如果要对list实现像java那样的下标循环,可以使用enumerate
for i,value in enumerate(['A', 'B', 'C']):
     pass
3、列表生成式
快速生成1-10
list = range(1, 11)
L = []
for x in range(1, 11):
     if x % 2 == 0:
          L.append(x * x)
可以简写成L = [x * x for x in range(1 , 11) if x %2 == 0]
两层循环实现全排列:
L = [m + n for m in 'ABC' for n in 'XYZ']
可以在列表生成式中的for循环里调用两个变量:
dict = {'one':1, ’two':2}
L = [k + '=' + v for k, v in dict.iteritems()]
4、生成器generator,通过列表生成式,我们可以直接创建一个列表,但是由于内存限制,列表的容量肯定有限,如果我们仅仅需要几个元素,那用列表生成式就浪费了大量空间。
generator应运而生,使用的方法和列表生成式相比只是把[]改成()。一边循环一边计算,通过next方法可以获取其中元素。
g = (X * X for x in range(10))
g.next()#0
g.next()#1
g.next()#4
g.next()#9
...
比较繁琐,其实用for循环也可以实现
for n in g:
     print n
如果推算的方法比较复杂,我们还可以通过函数来实现生成器
def fib(max):
     n, a, b = 0, 0, 1
     while n < max:
          yield b
          a, b = b, a + b
          n = n + 1
yield是定义generator的关键字,如果一个函数包含了yield,那么它就不再是一个普通函数,而是一个generator。该函数会在每次调用next()的时候执行,遇到yield语句的时候返回,再次执行时从上次返回的yield语句处继续执行。
for n in fib(6):
     print n

三、函数式编程
函数式编程允许把函数本身作为参数传入另一个函数,还允许返回一个函数
python对函数式编程提供部分支持,由于python允许使用变量,所以python不是纯函数编程语言
1、变量可以指向函数
x = abs(-10) # x = 10
x = abs # x等于与函数abs
2、函数名也是变量
abs = 10 # abs变成了数值,而不再是取绝对值函数,由于abs函数是定义在__builtin__模块中,所以要让修改abs变量的指向在其他模块也生效,要用__buildin__.abs = 10
3、传入函数
函数可以作为一个参数,传给另一个函数,被传入的函数称之为高阶函数
def add(x, y, f):
     return f(x) + f(y)
4、map函数,python内置函数,接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用在序列的每个元素上,并将结果作为新的list返回
def f(x):
     return x * x
map(f, range(1, 4)) # [1, 4, 9]
map(str, range(1,4)) # ['1', '2', '3']
5、reduce函数,同为python内置函数,参数需求同map,不过传入的函数必须接收两个参数。
reduce(f, [a, b, c, d]) = f(f(f(a, b), c), d)
6、可以在函数里定义函数
def str2int(s):
     def fn(x, y):
          return x * 10 + y
     def char2num(s):
          return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
     return reduce(fn, map(char2num, s))
通过lambda简化如下
def char2num(s):
     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2int(s):
     return reduce(lambda x,y: x*10+y, map(char2num, s))
7、lambda(匿名函数)用法,只能含有一个表达式, fn = lambda x, y : x * 10 + y
fn(2, 4) # 24
8、filter函数,用于过滤序列,接收一个返回值为布尔型的函数和一个序列,根据返回值是True或者False决定是否保留钙元素
9、sorted函数,用于排序,和以上内置函数不同,它通过传入自定义函数实现排序,是传在第二参数位置
默认我们规定,两个元素x和y,x<y返回-1.x==y返回0,x>y返回1
10、如果在函数里定义一个函数,并作为返回值返回
11、通过__name__可以拿到函数的名字
如: f = abs
abs.__name__ # abs
f,__name__ # abs
12、装饰器(decorator),在代码运行期间动态增加功能的方式。本质上decorator就是一个返回函数的高阶函数,所以我们要定义一个能打印日志的decorator可以如下:
def log(func):
     def wrapper(*args, **kw):
          print 'call %s():' % fun.__name__
          return fun(*args, **kw)
     return wrapper
借助Python的@语法,吧decorator置于函数定义处:
@log
def now():
     print '2013-12-25'
把@log放到now()定义处相当于执行了now = log(now)
如果decorator本身需要传入参数,如需要自定义输出的log内容,需要写一个3层嵌套:
def log(text):
     def decorator(func):
          def wrapper(*args, **kw):
               print '%s %s():' % (text, fun.__name__)
               return fun(*args, **kw)
          return wrapper
     return decorator
@log('execute')
def now():
     print '2013-12-25'
和两层嵌套的decorator相比,效果相当于
now = log('execute')(now)
以上两种decorator的定义没有问题,但函数也是对象,它有__name__属性,经过装饰之后,__name__已经从now编程了wrapper
python内置的functools.wraps就是用于替换__name__,所以一个完整的decorator如下:
import functools
def log(func):
     @functools.wraps(func)
     def wrapper(*args, **kw):
          print 'call %s():' % fun.__name__
          return fun(*args, **kw)
     return wrapper
面向对象设计模式中,decorator被称作装饰模式,OOP的装饰模式需要通过继承和组合来实现,而Python除了可以通过OOP的方式实现,直接从语法层次支持decorator。
13、偏函数,可以通过functoools.partial创建,作用是把一个函数的某些参数固定住(设置默认值),返回一个新的函数。
int('12345')
int('12345', 8)
import functools
int2 = functools.partial(int, 2)


文章评论

60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员和编码员之间的区别
程序员和编码员之间的区别
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
如何成为一名黑客
如何成为一名黑客
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
中美印日四国程序员比较
中美印日四国程序员比较
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
老程序员的下场
老程序员的下场
程序员的鄙视链
程序员的鄙视链
那些争议最大的编程观点
那些争议最大的编程观点
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员都该阅读的书
程序员都该阅读的书
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
代码女神横空出世
代码女神横空出世
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
我是如何打败拖延症的
我是如何打败拖延症的
旅行,写作,编程
旅行,写作,编程
我的丈夫是个程序员
我的丈夫是个程序员
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Java程序员必看电影
Java程序员必看电影
 程序员的样子
程序员的样子
程序员必看的十大电影
程序员必看的十大电影
10个调试和排错的小建议
10个调试和排错的小建议
编程语言是女人
编程语言是女人
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
漫画:程序员的工作
漫画:程序员的工作
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员应该关注的一些事儿
程序员应该关注的一些事儿
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
鲜为人知的编程真相
鲜为人知的编程真相
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
为什么程序员都是夜猫子
为什么程序员都是夜猫子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有