Python学习笔记10

?

1.函数式编程

?

理论就来自lambda演算,虽然没有学过lisp,一直被其大名震撼。

特性:

函数是以一等公民

可以作为参数

可以作为返回值

具有闭包特性

?

1.1参数传递方式

  • 一般参数传递:值传递,引用传递
  • 命名参数传递,使用"参数名=值"的格式,Python内成为关键字参数(keyword argument)
  • 默认参数设置
  • 可变参数,使用*开头,被解析成为一个元组
  • 可变参数,使用**开头,被解析成为一个字典,必须使用关键字参数的方式
  • 在调用的时候如何加上*,则会被解成元组或字典
  1. def func(*args):
  2. ????print type(args)
  3. ????print args
  4. ?
  5. func(1,2.3,‘true‘)
  6. ?
  7. def funcDict(**args):
  8. ????print type(args)
  9. ????print args
  10. ????print args[‘name‘]
  11. ?
  12. funcDict(name=‘pzdn‘,age=20)

?

1.2迭代器Iterator

类似C#的枚举器Enumerator

  • 典型标识:next(),it.next()
  1. lst =range(2)
  2. it = iter(lst)
  3. ?
  4. try:
  5. ????while True:
  6. ????????print next(it) # it.next()
  7. except StopIteration:
  8. ????pass

?

1.3生成器

生成器就是一种迭代器

  • 使用yield关键字实现迭代返回
  • 和C#的yield是一样的
  • 调用next方法实现迭代
  1. def fibonacci():
  2. ????a =b =1
  3. ????yield a
  4. ????yield b
  5. ????while True:
  6. ????????a,b = b, a+b
  7. ????????yield b
  8. ?
  9. for num in fibonacci():
  10. ????if num > 100: break
  11. ????print num

1.4 enumerate

enumerate类似jquery的$.each

for?idx, ele in?enumerate(lst):

???print?idx, ele

?

1.5lambda

属于匿名函数。

  • lambda
    args: expression。第一个是关键字,第二个是逗号分隔的参数,冒号之后是表达式块

?

1.6map

  • map,按照func计算之后返回

?

print map(lambda
x:x**3,range(1,6))

print map(lambda
x:x+x,‘abcde‘)

print map(lambda
x,y:x+y,range(8),range(8))

?

1.7filter

  • 类似Linq的Where扩展方法,选择为true的进行计算

print filter(lambda
x:x%2 != 0 and
x%3 != 0,range(2,20))

1.8reduce

官方解释:

  1. Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned.
  2. def reduce(function, iterable, initializer=None):
  3. ??it = iter(iterable)
  4. ??if initializer is None:
  5. ????try:
  6. ??????initializer = next(it)
  7. ????except StopIteration:
  8. ??????raise TypeError(‘reduce() of empty sequence with no initial value‘)
  9. ??accum_value = initializer
  10. ??for x in iterable:
  11. ????accum_value = function(accum_value, x)
  12. ??return accum_value

?

  1. def statistics(dic,k):
  2. ??if not k in dic:
  3. ????dic[k] = 1
  4. ??else:
  5. ????dic[k] +=1
  6. ??return dic
  7. ?
  8. lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
  9. print reduce(statistics,lst,{})
  10. #提供第三个参数,第一次,初始字典为空,作为statistics的第一个参数,然后遍历lst,作为第二个参数,然后将返回的字典集合作为下一次的第一个参数

?

  • 累加地计算,才能"reduce"减少

print reduce(lambda
x,y:x+y,range(1,101)) #5050

print reduce(lambda
x,y:x+y,range(1,101),20) #5070

?

1.9闭包

  • 类似js.一个作用就是访问作用于的私有变量

    另外,"闭包是绑定了外部作用域的变量(但不是全局变量)的函数。即使程序运行至离开外部函数,如果闭包仍然可见,则被绑定的变量仍然有效;每次运行至外部函数,都会重新创建闭包,绑定的变量是不同的,不需要担心在旧的闭包中绑定的变量会被新的值覆盖。"——摘自

?

2.多线程

?

2.1简单使用

?

threading.currentThread()

threading.enumerate()

thread.start_new_thread()

  1. import thread,threading
  2. import time
  3. ?
  4. def print_time(threadName, delay):
  5. ????count =0
  6. ????while count < 5:
  7. ????????time.sleep(delay)
  8. ????????count +=1
  9. ????????print "%s %s" % (threadName,time.ctime(time.time()))
  10. ????????print threading.currentThread().getName()
  11. ?
  12. try:
  13. ????thread.start_new_thread(print_time,("T1",4))
  14. ????thread.start_new_thread(print_time,("T2",2))
  15. ?
  16. except:
  17. ?????print "Error: unable to start thread"
  18. ?
  19. print threading.enumerate()
  20. while 1:
  21. ????pass

?

Thread类

thread.exit()

thread.run()

thread.start()

?

  1. exitFlag =0
  2. class myThread(threading.Thread):
  3. ????def __init__(self,threadID,name,counter):
  4. ????????threading.Thread.__init__(self)
  5. ????????self.threadID = threadID
  6. ????????self.name = name
  7. ????????self.counter = counter
  8. ????def run(self):
  9. ????????print "Starting " + self.name
  10. ????????print_time(self.name,self.counter,5)
  11. ????????print "Exiting " + self.name
  12. ?
  13. def print_time(threadName, delay, counter):
  14. ????while counter:
  15. ????????if exitFlag:
  16. ????????????thread.exit()
  17. ????????time.sleep(delay)
  18. ????????print "%s: %s" % (threadName, time.ctime(time.time()))
  19. ????????counter -= 1
  20. ?
  21. thread1 = myThread(1, "Thread-1", 1)
  22. thread2 = myThread(2, "Thread-2", 2)
  23. ?
  24. thread1.start()
  25. thread2.start()
  26. ?

?

for t in threads:

t.join()

print
"Exiting Main Thread"

?

2.2线程同步

?

threading.Lock().acquire()

threading.Lock().release()

?

3.Jinja模板

http://jinja.pocoo.org/

http://erhuabushuo.is-programmer.com/posts/33926.html

强大的模板处理引擎

  • 语句块使用:{% 语句 %}
  • 取值使用:{{ 值 }}
  • 控制流程:

{% if title %}

{{}}

{% else %}

{{}}

{% endif %}

?

  • 循环流程:

{% for post in posts%}

{{}}

{% endfor %}

?

  • 模板继承

    {% block content %}{% endblock %}

    ?

    {% extends "base.html" %}

    {% block content %}

    {% endblock %}

?

import
jinja2

?

template = jinja2.Template(‘Hello, {{name}}‘)

print template.render(name="pzdn")

?

?

4.简单爬虫框架

?

urllib:

参考:http://www.cnblogs.com/sysu-blackbear/p/3629420.html

  • urllib.urlopen(url[,data[,proxies]])

    打开一个url,返回一个文件对象。然后可以进行类似文件对象的操作

  • urllib.urlretrieve(url[,filename[,reporthook[,data]]])

    将url定位到的html文件下载到你本地的硬盘中。如果不指定filename,则会存为临时文件。

    urlretrieve()返回一个二元组(filename,mine_hdrs)

  • urllib.urlcleanup()

    清除缓存

  • urllib.quote(url)和urllib.quote_plus(url)

    url编码

  • urllib.unquote(url)和urllib.unquote_plus(url)

    url解码

  • urllib.urlencode(query)

    对查询参数编码


import
urllib

import
re

?

def downloadPage(url):

h = urllib.urlopen(url)

return h.read()

?

def downloadImg(content):

pattern = r‘src="(.+?\.jpg)" pic_ext‘

m = re.compile(pattern)

urls = re.findall(m, content)

?

for i, url in
enumerate(urls):

urllib.urlretrieve(url, "%s.jpg" % (i, ))

?

content = downloadPage("http://tieba.baidu.com/p/2460150866")

downloadImg(content)

?

时间: 2024-09-30 11:10:18

Python学习笔记10的相关文章

python学习笔记10:python操作数据库(mysql、redis)

一.python操作mysql数据库 python3中操作mysql数据需要安装一个第三方模块,pymysql,使用 pip install pymysql 安装即可 二.python操作redis redis是一个nosql类型的数据库,数据都存在内存中,有很快的读写速度 python3中操作reids需要安装一个第三方模块,redis,使用 pip install redis 安装即可

python学习笔记10(用户交互程序)

注释 单行:# 多行:上下各用3个连续单引号或双引号 3个引号除了多行注释,还可以打印多行 举例: msg = name = (name) (msg) 运行结果第二个print就是打印3行字符串. 如果单行,用引号即可:msg = "Alex Li" python中,单引号和双引号相同,除了单套双或双套单. 例:msg = "I'm Alex Li" 用户输入 举例:  = () password = () (,password) 格式化输出 %s(string),

Python学习笔记10—几个名词概念

循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如,while 语句. 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项.比如,for 语句. 递归(recursion),指的是一个函数不断调用自身的行为.比如,以编程方式输出著名的斐波纳契数列. 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次. 迭代 我们常常将哪些能够用诸如循环语句之类的方法来一个一个读取元素的对象,就称之为可迭代的对象.那么用来循环的如 f

python基础教程_学习笔记10:异常

异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

python 学习笔记 14 -- 常用的时间模块之datetime

书接上文,前面我们讲到<常用的时间模块之time>,这次我们学习datetime -- 日期和时间值管理模块 使用apihelper 查看datetime 模块,我们可以看到简单的几项: date       ---  日期对象,结构为date(year, month, day) time       ---  时间值对象,结构为 time([hour[, minute[, second[, microsecond[, tzinfo]]]]]).时间对象所有的参数都是可选的.tzinfo 可以

【python学习笔记】6.抽象

[python学习笔记]6.抽象 创建函数: 使用def语句定义函数,不用声明参数类型,和返回值类型 def function_name(param1, param2): 'this is document' pass # fuction body return value # 可选 函数体的第一行字符串被用作文档字符串 callable(func): 用来判读func是否可以调用 help函数用来返回相关函数的文档 函数名可以作为变量赋值一个变量 位置参数:函数调用期间,参数按照参数列表中的顺