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标准库函数充电(为已编号的行进行编号)

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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" 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的文档的功能还是比较强悍的,要从分的利用好

Python学习笔记(迭代、模块扩展、GUI 、编码处理等)的更多相关文章

  1. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  2. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  3. python学习笔记(十 一)、GUI图形用户界面

    python图形用户界面就是包含按钮.输入框.选择框等组件的窗口.主要依赖与工具包进行代码编写.python GUI工具包并发互斥的,你可以选择多个工具包进行安装,有极大选择空间.每个工具包都有不同用 ...

  4. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  5. python学习笔记五 模块下(基础篇)

    shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb" ...

  6. python学习笔记十——模块与函数

    第五章 模块与函数 5.1 python程序的结构 函数+类->模块              模块+模块->包                 函数+类+模块+包=Python pyth ...

  7. python学习笔记_week5_模块

    模块 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), 本质就是.py结尾的python文件(文件名:test.py,对应模块名:test) 包:用来从逻辑上 ...

  8. python学习笔记(八)-模块

    大型python程序以模块和包的形式组织.python标准库中包含大量的模块.一个python文件就是一个模块.1.标准模块 python自带的,不需要你安装的2.第三方模块 需要安装,别人提供的. ...

  9. Python学习笔记1—模块

    模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11   (module11是module的子模块) 例: ...

  10. Python学习笔记2——模块的发布

    1.为模块nester创建文件夹nester,其中包含:nester.py(模块文件): """这是"nester.py"模块,提供了一个名为prin ...

随机推荐

  1. ng-if else的使用

    <!DOCTYPE html> <html> <head> <script src="http://code.angularjs.org/1.2.0 ...

  2. poj1113 凸包

    result=对所有点凸包周长+pi*2*L WA了一次,被Pi的精度坑了 以后注意Pi尽可能搞精确一点.Pi=3.14还是不够用 Code: #include<vector> #incl ...

  3. windows核心编程读后感(待续)

    自从大一读那本超厚的C程序设计以后,从来没有像这样慢慢地读一本书了.windows核心这本书足足看了2个多星期.一张张慢慢看,做笔记.感觉学到了很多基础的知识,关于内核方面的没有啥可以做实验的,都在看 ...

  4. Always review

    Data structures A data structure is a way to store and organize data in order to facilitate access a ...

  5. hihocoder 1347 小h的树上的朋友

    传送门 时间限制:18000ms单点时限:2000ms内存限制:512MB 描述 小h拥有$n$位朋友.每位朋友拥有一个数值$V_i$代表他与小h的亲密度.亲密度有可能发生变化.岁月流逝,小h的朋友们 ...

  6. 分布式服务框架Zookeeper

    协议介绍 zookeeper协议分为两种模式 崩溃恢复模式和消息广播模式 崩溃恢复协议是在集群中所选举的leader 宕机或者关闭 等现象出现 follower重新进行选举出新的leader 同时集群 ...

  7. React Native 开发之 (04) 例子讲解

    一.了解index.ios.js React-Native就是在开发效率和用户体验间做的一种权衡.React-native是使用JS开发,开发效率高.发布能力强,不仅拥有hybrid的开发效率,同时拥 ...

  8. 服务器配置ssl证书支持苹果ATS方法

    服务器配置ssl证书支持苹果ATS方法 发布日期:2016-12-14 苹果安全工程&架构部门主管Ivan Kristic表示ATS将在今年底成为App Sotre app的必要条件,这将大幅 ...

  9. properties 配置文件中值换行的问题

    在使用properties配置文件的时候我们经常碰到如下两个问题 1:当a=b中的b值内容特别长的时候为了阅读方便我们手动换行,但如果我们直接回车那么后面的数据就会丢失.那如何解决呢? 例如: a=a ...

  10. centos 创建以日期为名的文件夹

    [root@desk task]# mkdir $(date +%Y)$(date +%m)$(date +%d) [root@desk task]# mkdir `date +%Y``date +% ...