分类

Python

Python 2018-05-05

Python中的字典和集合

Python标准库中的所有映射类型都是使用dict来实现的,因此他们都有一个共同的限制,即只有可散列的数据类型才可以作为映射的键,那么什么是可散列的数据类型呢?下面介绍下:
在python词汇表中,关于可散列类型的定义有这么一段话:

如果一个对象是可散列的,那么在这个对象的生命周期中,他的可散列值是不变的,而且这个对象需要实现__hash__()方法。另外可散列对象还要有__eq__()方法,这样才可以和别的键做比较,如果两个可散列对象的值是相等的,那么他们的散列值一定是相等的。

原子不可变数据类型(strbytes和数值类型)都是可散列类型,frozenset也是可散列的,因为根据其定义,frozonset里只能容纳可散列类型。元组的话,只有当一个元组敖汉的所有元素都是可散列类型的情况下,它才是可散列的。一般来讲,用户自定义的类型都是可散列的,散列值就是他们的id()函数返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象内部实现了__eq__方法并且在方法内部用到了这个对象的内部状态的话那么只有当所有内部状态都是不可变的情况下,这个对象才是可散列的。

处理找不到的键

当字典d[k]找不到正确的键时,Python会抛出异常,虽然我们可以使用d.get(k,default)来代替d[k],给找不到的键一个默认的返回值,但是在更新时候,效率还是很低的,在这种情况...

Python 2018-05-01

Python中的序列

内置序列类型概述:

Python标准库使用C实现了丰富的序列类型,列举如下:

  • 容器序列
    listtuplecollsctions.deque这些序列能存放不同的数据类型。
  • 扁平序列
    str,bytes,bytearray,memoryview和array.array,这些序列只能存放一种类型。

容器序列存放的是他们所包含的任意类型的对象引用,而扁平序列存放的是值而不是引用,也就是说,扁平序列其实是一段连续的内存空间,因此扁平序列其实更加紧凑,但是他们里面只能存放例如字符,字节和数值这种基础类型。
序列类型还可以按照是否可以修改赖分类。
- 可变序列
listbytearrayarray.array,collections.dequememview - 不可变序列
tuplestrbytes

列表推导和生成器表达式

虽然都可以使用列表推导赖初始化元组,数组或其他序列类型,但是生成器表达式是更好都选择,因为生成器表达式背后遵循了迭代器都协议,可以逐个的产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数中。 下面分别是列表推导和生成器表达式的简单示例:

>>>vals=range(10)
>>>[s for s in vals if s>5]
[6, 7, 8, 9]
>>>tuple(s for s in vals if s>5)
(...
Python 2018-01-24

使用树莓派和OpenCV 实现家庭监控和移动目标探测

本篇文章主要是分享使用opencv和树莓派实现的移动目标探测,所以需要有opencv环境,另外你的电脑必须有摄像头支持。 具体参考自伯乐在线的 这篇文章 具体内容大家可以参考下原文,我在其基础上大概修改了下,下面是代码:

import datetime
import time
import cv2
import logging
import imutils
import os

lastSaveTime = datetime.datetime.now()
motionCounter = 0
path = os.path.split(os.path.realpath(__file__))[0]
avg = None
cap = None
i = 0
logfilename = path + '/logger.log'
logging.basicConfig(filename=logfilename, level=logging.INFO)
while (1):

    timestamp = datetime.datetime.now()
    if timestamp.hour >= 18 or timestamp.hour <= 9:
        logging.info('time:' + str(timestamp.hour))
        time.sle...
Python 2018-01-06

Django 2.0升级小记

备受期待的django 2.0已经发布了,最大的一个变化就是不再支持python2.x版本了,另外还有在使用方面有了一些变化,下面就介绍下我在升级的时候遇到的错误。

from django.core.urlresolvers import reverse

变成了

from django.urls import reverse
  • settings.py文件,MIDDLEWARE_CLASSES更改成了MIDDLEWARE

  • django.shortcuts.render_to_response()方法已经被弃用了,现在使用django.shortcuts.render()方法。

  • User.is_authenticated()User.is_anonymous()方法更改成了属性:User.is_authenticatedUser.is_anonymous
  • 删除了SessionAuthenticationMiddleware类,不再需要该中间件,在Django 1.10+中已经默认开启了。
  • @register.assignment_tag改成了@register.simple_tag
  • 为model的ForeignKeyOneToOne的属性增加on_delete=models.CASCADE
  • url更简单了,如下:
path(r...
6250 9
Python 2018-01-01

使用python和opencv实现简单的网络摄像头

这个网络摄像头需要一个客户端和服务端,客户端使用opencv捕捉摄像头,通过socket将图片流传输到服务端,服务端接受图片流,使用HTTPServer渲染生成一个简单的网页,将图片流用mjpeg的方式传输到浏览器中,这样就可以直接用浏览器来查看摄像头视频了。主要的实现方式就是这样的,下面详细介绍下.

安装依赖

首先需要在客户端安装opencv,安装方式可以Google下,这里就不再赘述了,服务端需要安装pillownumpy这两个模块。

实现代码

首先是客户端的代码:

import io
import socket
import struct
import time
import datetime
import cv2

client_socket = socket.socket()
client_socket.connect(('服务端ip地址或域名', 8002))

connection = client_socket.makefile('wb')
try:
    #打开摄像头
    cap = cv2.VideoCapture(0)
    while (1):
        #读取图片
        ret, frame = cap.read()
        # cv2.imshow("capture", frame)
        if cv2....
Python 2017-11-05

使用python连接hive

首先需要安装包:

pip install pyhive[hive]

如果安装报错的话执行:

sudo apt-get install libsasl2-dev

再安装下。

然后需要启动hive服务:

hive --service hiveserver2

修改hive验证方式: 在hive-site.xml中:

<property>
   <name>hive.server2.authentication</name>
   <value>NOSASL</value>
   <description>
     Expects one of [nosasl, none, ldap, kerberos, pam, custom].
     Client authentication types.
       NONE: no authentication check
       LDAP: LDAP/AD based authentication
       KERBEROS: Kerberos/GSSAPI authentication
       CUSTOM: Custom authentication provider
               (Use with property hive.server2.custom.authentica...
发现更多