Python学习笔记(迭代、模块扩展、GUI 、编码处理等)

时间:2023-03-09 19:21:25
Python学习笔记(迭代、模块扩展、GUI 、编码处理等)

PythonIDLE中的编码处理

http://www.tuicool.com/articles/NbyEBr

原文标题:Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码

http://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code/?utm_source=tuicool

python写入带有中文字的字符串到文件

# -*- coding: utf-8 -*-

import codecs
content = u'你好,脚本分享网 sharejs.com'
f = codecs.open('c:/1.txt','w','utf-8')
f.write(content)

Python中迭代器

class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def next(self):
self.a, self.b = self.b, self.a + self.b
return self.a
def __iter__(self):
return self #在迭代器和可迭代序列上进行迭代,还能把他们转换成序列 (实现了__iter__方法的对象是可迭代的,实现了next方法对象则是迭代器)
fibs = Fibs()
for f in fibs:
if f > 10000:
print f
break >>>1597

Python迭代器使用(yield)

回溯法求解8皇后问题

#争端函数,问题描述:如何在棋盘上放置8个皇后,使其不会相互攻击

def conflict(state, nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i] -nextX) in (0, nextY - i):
return True
return False #回溯求解问题
def queens(num=8, state = ()):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num - 1:
yield (pos, )
else:
for result in queens(num, state + (pos, )):
yield (pos, ) + result #打印解决方案
def prettyprint(solution):
def line(pos, length = len(solution)):
return ' . ' * (pos) + ' X ' + ' . ' * (length - pos - 1)
for pos in solution:
print line(pos) #随机打印一个解决方案
import random
prettyprint(random.choice(list(queens(8))))

aaarticlea/png;base64,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" alt="" />

Python标准库函数充电(为已编号的行进行编号)

Python学习笔记(迭代、模块扩展、GUI 、编码处理等)

open文件后,记得close总是没有问题的。或者放入try finally语句中。或者使用

from __future__ import with_statement

with open(" ") as somefile:

do_somnething(somefile)

GUI章节中关于函数命名的一段话:

wx包中的方法都是以大写字母开头的,而这和Python的习惯是相反的。这样的做的原因是这些方法名和基础的C++包wxWidgets中的方法名都是对应的。

尽管没有正式的规则反对或者函数名以大写字母开头,但是规范的做法是为类保留这样的名字。

  • 扩展Python

扩展Python的C语言实现的方法(可以自己写代码,或者是使用一个叫做SWIG的工具),以及扩展其他两个Python实现——Jython和IronPython的方法。

除此之外,还有一些关于访问外部的其它方法的提示。

Jython对应Java, IronPython对应C#和其他的.NET语言。

扩展Python通常就是指扩展CPython,可以使用的自动化工具推荐使用SWIG(http://www.swig.org

(1) 为代码写接口文件。这很像C语言的头文件(而且,为了更简单,可以直接使用头文件)

(2)在接口文件上运行SWIG,自动生成部分C语言代码(包装代码)。

(3)把原来的C语言代码和产生的包装代码一起编译来产生共享库。

比如,一个简单的检测回文的C语言函数(palindrome.c)

#include <string.h>

int is_palindrome(char *text){
int i = ;
int n = strlen(text); int ret = ;
for(i = ; i <= n/; i++){
if(text[i] != text[n-i-]){
ret = ;
break;
}
} return ret;
}

还需要动手写一个文件(palindrome.i)

该文件只需要声明导出的所有的函数(和变量)即可。

除此之外,头部的一个单元(通过%{和}%来分界)内,可以指定包含头文件(比如本例中的string.h)以及在这之前的一个%module声明,即为模块定义一个名字。

%module palindrome
%{
#include <string.h>
%} extern int is_palindrome(char *text);
  • 运行SWIG

swig -python palindrome.i

应该得到两个新文件,一个是palindrome_wrap.c,另一个是palindrome.py

  • 编译、链接以及使用

需要确保需要的文件能够顾找到,本文给出参考的绝对路径

$ gcc -c palindrome.c

$ gcc -user/include/python2.7 -c palindrome_wrap.c

$ gcc -shared palindrome.o, palindrome_wrap.o c:/python27/libs/libpython27.a  -o _palindrome.pyd

_palindrome.pyd, 就是得到的共享库,他能直接导入Python(放在当前的工作目录即可)。

aaarticlea/png;base64,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" alt="" />

或者采用setup.py借用distutils工具一条编译命令即可

# -*- coding: utf-8 -*-
"""
Created on Wed Jan 28 16:54:09 2015 @author: Administrator
""" from distutils.core import setup, Extension setup(name = 'palindrome', version = '1.0',
description = 'A simple example',
author = 'Magnus Lie hetland',
ext_modules = [Extension('_palindrome', ['palindrome.c', 'palindrome.i'])]) #命令 python setup.py build_ext --inplace
#要配置好环境变量和swig工具

得到

aaarticlea/png;base64,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****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" alt="" />

关于这个问题,有人在百度文库有详细的解释,不明白的请参考。

  • Python 中一切皆为对象

Every object has an identity, a type and a value. An object’s identity never changes once it has been created; you may think of it as the object’s address in memory. The ‘is‘ operator compares the identity of two objects; the id() function returns an integer representing its identity (currently implemented as its address). An object’s type is also unchangeable. [1] An object’s type determines the operations that the object supports (e.g., “does it have a length?”) and also defines the possible values for objects of that type. The type() function returns an object’s type (which is an object itself). The value of some objects can change. Objects whose value can change are said to be mutable; objects whose value is unchangeable once they are created are called immutable. (The value of an immutable container object that contains a reference to a mutable object can change when the latter’s value is changed; however the container is still considered immutable, because the collection of objects it contains cannot be changed. So, immutability is not strictly the same as having an unchangeable value, it is more subtle.) An object’s mutability is determined by its type; for instance, numbers, strings and tuples are immutable, while dictionaries and lists are mutable.

Objects are never explicitly destroyed; however, when they become unreachable they may be garbage-collected. An implementation is allowed to postpone garbage collection or omit it altogether — it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable

python是纯血统的面向对象的变成语言,与java不同。

为此我们可以看一下,我们知道java中int为基本数据类型,在持久化的时候,需要包装成Integer类对象。

但是在python中,一切皆对象。什么都是对象,包括你的代码。

为此我们进行一番探究。

1
2
3
4
5
6
7
8
# this is just begining
i=5
print hex(id(i))
print type(i)
i=10
print hex(id(i))
print type(i)
print  i.__add__(5
1
然后运行程序发现:

0x125a8c8
<type 'int'>
0x125a88c
<type 'int'>

15

通过阅读上面的英文部分,不难发现

i的 id,value,以及type,所有对象都具有上述三种属性

然后查看帮助文档

help> id
Help on built-in function id in module __builtin__:
id(...)
    id(object) -> integer
    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory address.)

该函数返回的对象的内存地址值,通过该函数的声明不难发现i也是对象。

细心的读者可能会发现,此处发生了内存泄露,就i在指向10以后,对象5就不在被任何对象所引用。

不用担心,python的开发者早就想好处理方法,即对象的垃圾回收机制。

我们继续讨论int class 的详细情况

help> int
Help on class int in module __builtin__:
class int(object)
 |  int(x[, base]) -> integer
 |
 |  Convert a string or number to an integer, if possible.  A floating point
 |  argument will be truncated towards zero (this does not include a string
 |  representation of a floating point number!)  When converting a string, use
 |  the optional base.  It is an error to supply a base when converting a
 |  non-string.  If base is zero, the proper base is guessed based on the
 |  string content.  If the argument is outside the integer range a
 |  long object will be returned instead.
 |
 |  Methods defined here:
 |
 |  __abs__(...)
 |      x.__abs__() <==> abs(x)
 |
 |  __add__(...)
 |      x.__add__(y) <==> x+y
 |
 |  __and__(...)

|      x.__and__(y) <==> x&y

此处省略了很多~~~~~~~~~~~~~~~~~~~··

通过帮助文档,我们知道int class 继承自object类,然后看到的该类的相关函数,

从该类的构造函数我们可以知道很多,

rint int(100)

1
2
3
4
print int('100',8)
# notice here ,something like typedef
integer=int
print type(integer)
1
2
3
print hex(id(integer)
# a new object
print type(integer('100',8))

输出内容如下:

100
64
<type 'type'>

0x1e1f35e0
<type 'int'>
需要注意的是:integer=int

该语句的作用相当于创建了int class的一个alias或是别名,这样你就可以用它来创建新的对象,很神奇吧

注意此时integer的值为int,id=0x1e1f35e0,type为type类型

下面顺藤摸瓜,自然想知道object类的定义是什么呢?

>>> help(object)
Help on class object in module __builtin__:
class object
 |  The most base type

从帮助文档我们仅能够推测数该class为基类,其它的信息就只能参阅官方文档了。搜索相关资料,发现

Python源码剖析的讲解还是比较有意思的,正在阅读中,后续会补充上~~~~~~~·····

同时也可以发现python的文档的功能还是比较强悍的,要从分的利用好