python语言中的如何输入编号叫啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python语言中的如何输入编号叫啥相关的知识,希望对你有一定的参考价值。
Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。 一个module的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),则需要在第一行或第二行指定编码声明:# -*- coding=utf-8 -*-或者 #coding=utf-8 其他的编码如:gbk、gb2312也可以; 否则会出现类似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho for details这样的异常信息;n.org/peps/pep-0263.html
命令查看脚本默认的编码方式
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>>
2.2 python中的编码与解码
先说一下python中的字符串类型,在python中有两种字符串类型,分别是str和unicode,他们都是basestring的派生类;str类型是一个包含Characters represent (at least) 8-bit bytes的序列;unicode的每个unit是一个unicode obj;所以:
len(u'中国')的值是2;len('ab')的值也是2;
在str的文档中有这样的一句话:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是说在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等;
2.2.1 print 语句解释编码问题
print 是打印默认的编码方式,相当于对任何对象encode编码转化成str对象。默认是gbk的编码就是对Unicode进行自动的gbk编码,再按照gbk编码输出。
当print语句碰到一个unicode目标的时候,会用当前python shell环境的默认编码格式首先对unicode对象进行encode(此时unicode对象已经变成了一个str对象了),然后再以默认编码格式为基础,根据其包含的汉字和编码的对应规则,把这个str对象解释成中文并显示出来。但是当print语句碰到的直接是个str目标的时候,就不管其从unicode转到str时用的编码格式是什么,直接用默认编码格式的对应规则来解释成中文。所以,当unicode对象转换成str时的编码格式和print语句的默认编码格式不一致的时候就会出现乱码现象。比如在cmd的python shell里面:
复制代码
复制代码
证明Python 系统默认编码gbk
>>> s= '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> s = u'你好'
>>> s
u'\xc4\xe3\xba\xc3'
>>> s = '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> print type(s)
<type 'str'>
>>>unicode 编码打印错误,print 解析字符串而不是Unicode 编码
>>> s = u'你好'
>>> print s
ÄãºÃ
>>>uni = u'你好' #存入一个unicode对象
>>>print uni
你好 #可以正常显示 相当于Unicode.encode(gbk)
>>>uni.encode("gbk")
'\xc4\xe3\xba\xc3' #显示的是个str对象了,如果type(uni.encode("gbk"))得到的就是str对象
>>>print uni.encode("gbk")
你好 #可以正常显示,因为在cmd下的pythonshell里默认个编码格式就是gbk,gbk解析
>>>uni.encode("utf-8")
'\xe4\xbd\xa0\xe5\xa5\xbd' #可以看到,encode用的编码格式不同,编成的字符串也是不同的
>>>print uni.encode("utf-8")
浣犲ソ #乱码,因为用了gbk中汉字和字符串编码格式对应规则去解释了用utf-8编码成的字符串。解释的编码格式不对应。
#######さらに######
>>>print '\xc4\xe3' #自己写出来的这么个字符串(前面不加r)的话也会被print解释成中文,按照编码格式输出
你
>>>print uni.encode("utf-8").decode("gbk")
浣犲ソ
'''
乱码,而且和上面的乱码一样,这是因为,在uni被utf-8 encode之后,这个对象变成了str对象,是'\xe4\xbd\xa0\xe5\xa5\xbd' 这个。
后来,它又被按照gbk的规则解码,又变回了unicode,但是此时它在内存里的二进制数据已经和最初的uni不一样了。
最初的uni,应该是'\xc4\xe3\xba\xc3'.decode("gbk"),而现在的这个东西,他decode之前的字符串已经变过了。
这么一个东西再拿去print,又把它编码成了gbk格式,相当于前面那步decode没有做,变回了'\xe4\xbd\xa0\xe5\xa5\xbd'。
再解释成汉字,当然就和最开始用uni编码成utf-8格式再解释成汉字的乱码一样了
'''
复制代码
2.2.2 脚本print 打印的正确方式
上面已经证明了系统的默认编码方式是gbk,就是print 最后正确的编码方式应该是gbk
两种解决编码不匹配的情况:
一是明确的指示出 s 的编码方式
# -*- coding: utf-8 -*-
s = '中文'
s.decode('utf-8').encode('gb2312')
二是更改 sys.defaultencoding 为文件的编码方式
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb2312')
三、实践经验中爬取数据的获得
复制代码
# -*- coding: utf-8 -*-
'''
#加油两个字可以很好的比较编码正确和错误
#### 错误的处理方式,
s = "中文"
print s
#这里print就不是输出gbk的编码,是按照头文件utf-8的格式输出
# 结果:中文
print s.decode('utf-8')
#结果中文,s进行解码称为Unicode,print打印就和系统print打印一样自动将Unicode进行
#解码,不用encode编码也能输出,但是最好转化成为字符串输出。
上面实例就是错误使用编码,错误使用编码会出现个别字体的乱码。
'''
'''
要点1、声明头文件# -*- coding: utf-8 -*- 说明所有的代码和中文是utf-8的编码方式
要点2、print输出函数输出到前台cmd中的默认系统编码方式是GBK,
要点3、尽量将Unicode转化成为字符串str (gbk或者utf-8),再去处理。
#unicode 转化成为字符串
s = u'加油'
print s
#结果:加油。原因:系统自动将Unicode升级gbk编码成为字符串,然后系统print 打印gbk
print s.encode('utf-8')
#结果:锷犳补。错误原因:Unicode 编码成为utf-8的字符串形式,但是print打印系统是gbk的,编码冲突。
print s.encode('gbk')
#结果:加油。原因:和print s等价,认为编码了gbk,系统打印
ss = "加油"
print ss
#结果:锷犳补。原因:ss为utf-8的字符串str,print 打印的对应编码字符串是gbk的,所以编码冲突。
print ss.decode('utf-8').encode('gbk')
#结果:加油。原因:ss首先从字符串编码utf-8解码成为unicode,然后进行编码gbk,等价使用print ss.decode('utf-8')。
'''
'''
3.1python中关于中文转换url编码的问题
爬虫的时候我们经常会碰到中文链接编码出现变换的问题,
例如'丽江'中文在url的地址编码却是'%E4%B8%BD%E6%B1%9F',
因此需 要做一个转换。这里我们就用到了模块urllib。
'''
import urllib
data = '丽江'
print data.decode('utf-8').encode('gbk')
#对utf-8的中文编码
print urllib.quote(data)
#那我们想转回去呢?
print urllib.unquote('%E4%B8%BD%E6%B1%9F').decode('utf-8').encode('gbk')
'''
'丽江'在网页编码是gbk的转换码是'%C0%F6%BD%AD',utf-8中的转化码是'%E4%B8%BD%E6%B1%9F',其实是编码问题。
百度的是gbk,其他的一般网站比如google就是utf8的。所以可以用下列语句实现。
'''
#江苏课题的编码转化
import sys,urllib
s = '江苏'
print urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
print urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
for place in ['南京','无锡','徐州','常州','苏州','盐城','南通','连云港','淮安','盐城','扬州']:
print urllib.quote(place)
####################
#结果:
'''
>>>
丽江
%E4%B8%BD%E6%B1%9F
丽江
%E4%B8%BD%E6%B1%9F
%E6%B6%93%E8%8A%A5%E7%9D%99
>>>
''' 参考技术A Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。 一个module的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),则需要在第一行或第二行指定编码声明:
# -*- coding=utf-8 -*-或者 #coding=utf-8 其他的编码如:gbk、gb2312也可以; 否则会出现类似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho for details这样的异常信息;n.org/peps/pep-0263.html
命令查看脚本默认的编码方式
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>>
2.2 python中的编码与解码
先说一下python中的字符串类型,在python中有两种字符串类型,分别是str和unicode,他们都是basestring的派生类;str类型是一个包含Characters represent (at least) 8-bit bytes的序列;unicode的每个unit是一个unicode obj;所以:
len(u'中国')的值是2;len('ab')的值也是2;
在str的文档中有这样的一句话:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是说在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等;
2.2.1 print 语句解释编码问题
print 是打印默认的编码方式,相当于对任何对象encode编码转化成str对象。默认是gbk的编码就是对Unicode进行自动的gbk编码,再按照gbk编码输出。
当print语句碰到一个unicode目标的时候,会用当前python shell环境的默认编码格式首先对unicode对象进行encode(此时unicode对象已经变成了一个str对象了),然后再以默认编码格式为基础,根据其包含的汉字和编码的对应规则,把这个str对象解释成中文并显示出来。但是当print语句碰到的直接是个str目标的时候,就不管其从unicode转到str时用的编码格式是什么,直接用默认编码格式的对应规则来解释成中文。所以,当unicode对象转换成str时的编码格式和print语句的默认编码格式不一致的时候就会出现乱码现象。比如在cmd的python shell里面:
复制代码
复制代码
证明Python 系统默认编码gbk
>>> s= '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> s = u'你好'
>>> s
u'\xc4\xe3\xba\xc3'
>>> s = '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> print type(s)
<type 'str'>
>>>unicode 编码打印错误,print 解析字符串而不是Unicode 编码
>>> s = u'你好'
>>> print s
ÄãºÃ
>>>uni = u'你好' #存入一个unicode对象
>>>print uni
你好 #可以正常显示 相当于Unicode.encode(gbk)
>>>uni.encode("gbk")
'\xc4\xe3\xba\xc3' #显示的是个str对象了,如果type(uni.encode("gbk"))得到的就是str对象
>>>print uni.encode("gbk")
你好 #可以正常显示,因为在cmd下的pythonshell里默认个编码格式就是gbk,gbk解析
>>>uni.encode("utf-8")
'\xe4\xbd\xa0\xe5\xa5\xbd' #可以看到,encode用的编码格式不同,编成的字符串也是不同的
>>>print uni.encode("utf-8")
浣犲ソ #乱码,因为用了gbk中汉字和字符串编码格式对应规则去解释了用utf-8编码成的字符串。解释的编码格式不对应。
#######さらに######
>>>print '\xc4\xe3' #自己写出来的这么个字符串(前面不加r)的话也会被print解释成中文,按照编码格式输出
你
>>>print uni.encode("utf-8").decode("gbk")
浣犲ソ
'''
乱码,而且和上面的乱码一样,这是因为,在uni被utf-8 encode之后,这个对象变成了str对象,是'\xe4\xbd\xa0\xe5\xa5\xbd' 这个。
后来,它又被按照gbk的规则解码,又变回了unicode,但是此时它在内存里的二进制数据已经和最初的uni不一样了。
最初的uni,应该是'\xc4\xe3\xba\xc3'.decode("gbk"),而现在的这个东西,他decode之前的字符串已经变过了。
这么一个东西再拿去print,又把它编码成了gbk格式,相当于前面那步decode没有做,变回了'\xe4\xbd\xa0\xe5\xa5\xbd'。
再解释成汉字,当然就和最开始用uni编码成utf-8格式再解释成汉字的乱码一样了
'''
复制代码
2.2.2 脚本print 打印的正确方式
上面已经证明了系统的默认编码方式是gbk,就是print 最后正确的编码方式应该是gbk
两种解决编码不匹配的情况:
一是明确的指示出 s 的编码方式
# -*- coding: utf-8 -*-
s = '中文'
s.decode('utf-8').encode('gb2312')
二是更改 sys.defaultencoding 为文件的编码方式
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb2312')
三、实践经验中爬取数据的获得
复制代码
# -*- coding: utf-8 -*-
'''
#加油两个字可以很好的比较编码正确和错误
#### 错误的处理方式,
s = "中文"
print s
#这里print就不是输出gbk的编码,是按照头文件utf-8的格式输出
# 结果:中文
print s.decode('utf-8')
#结果中文,s进行解码称为Unicode,print打印就和系统print打印一样自动将Unicode进行
#解码,不用encode编码也能输出,但是最好转化成为字符串输出。
上面实例就是错误使用编码,错误使用编码会出现个别字体的乱码。
'''
'''
要点1、声明头文件# -*- coding: utf-8 -*- 说明所有的代码和中文是utf-8的编码方式
要点2、print输出函数输出到前台cmd中的默认系统编码方式是GBK,
要点3、尽量将Unicode转化成为字符串str (gbk或者utf-8),再去处理。
#unicode 转化成为字符串
s = u'加油'
print s
#结果:加油。原因:系统自动将Unicode升级gbk编码成为字符串,然后系统print 打印gbk
print s.encode('utf-8')
#结果:锷犳补。错误原因:Unicode 编码成为utf-8的字符串形式,但是print打印系统是gbk的,编码冲突。
print s.encode('gbk')
#结果:加油。原因:和print s等价,认为编码了gbk,系统打印
ss = "加油"
print ss
#结果:锷犳补。原因:ss为utf-8的字符串str,print 打印的对应编码字符串是gbk的,所以编码冲突。
print ss.decode('utf-8').encode('gbk')
#结果:加油。原因:ss首先从字符串编码utf-8解码成为unicode,然后进行编码gbk,等价使用print ss.decode('utf-8')。
'''
'''
3.1python中关于中文转换url编码的问题
爬虫的时候我们经常会碰到中文链接编码出现变换的问题,
例如'丽江'中文在url的地址编码却是'%E4%B8%BD%E6%B1%9F',
因此需 要做一个转换。这里我们就用到了模块urllib。
'''
import urllib
data = '丽江'
print data.decode('utf-8').encode('gbk')
#对utf-8的中文编码
print urllib.quote(data)
#那我们想转回去呢?
print urllib.unquote('%E4%B8%BD%E6%B1%9F').decode('utf-8').encode('gbk')
'''
'丽江'在网页编码是gbk的转换码是'%C0%F6%BD%AD',utf-8中的转化码是'%E4%B8%BD%E6%B1%9F',其实是编码问题。
百度的是gbk,其他的一般网站比如google就是utf8的。所以可以用下列语句实现。
'''
#江苏课题的编码转化
import sys,urllib
s = '江苏'
print urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
print urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
for place in ['南京','无锡','徐州','常州','苏州','盐城','南通','连云港','淮安','盐城','扬州']:
print urllib.quote(place)
####################
#结果:
'''
>>>
丽江
%E4%B8%BD%E6%B1%9F
丽江
%E4%B8%BD%E6%B1%9F
%E6%B6%93%E8%8A%A5%E7%9D%99
>>>
'''1. Unicode 相信都很熟悉:,就是\u0000这样的
2. 二进制编码也很简单,就是\x00\x00这样的,平常看到的utf-8,cp936都是二进制编码
3. 二进制编码是具象的,10001100原样就可以存储,而Unicode
Python中的这种赋值叫啥? a = b = 真
【中文标题】Python中的这种赋值叫啥? a = b = 真【英文标题】:What is this kind of assignment in Python called? a = b = TruePython中的这种赋值叫什么? a = b = 真 【发布时间】:2012-07-14 22:54:17 【问题描述】:我知道tuple unpacking,但是如果你在一行上有多个等号,这个作业叫什么?啦a = b = True
它总是让我有点不适应,尤其是当 RHS 是可变的时,但我在找到正确的关键字以在文档中搜索时遇到了真正的麻烦。
【问题讨论】:
我会称他们为“chainedassignments。” 这能回答你的问题吗? How do chained assignments work? 【参考方案1】:这是一个任务链,用来描述它的术语是......
- 请给我打鼓吗?
链式赋值。
我只是在谷歌上运行了一下,发现关于这个主题的阅读内容并不多,可能是因为大多数人觉得它使用起来非常简单(而且只有真正的极客想了解更多关于主题)。
在前面的表达式中,计算顺序可以看作是从最右边的=
开始,然后向左移动,这相当于写作:
b = True
a = b
上面的顺序是大多数语言描述的赋值链,但是 python 做的不同。在 python 中,表达式被评估为下面的等价物,尽管它不会产生任何其他结果而不是前面描述的结果。
temporary_expr_result = True
a = temporary_expr_result
b = temporary_expr_result
在 *** 上可以进一步阅读:
How do chained assignments work? python【讨论】:
真正的罪魁祸首是这种“链式分配”。如果a = b = c
意味着b = c
在a = b
之前执行,它将被链接分配,但正如您所展示的那样,情况并非如此。而是按顺序进行分配。
这阐明了在像x = dictionary['x'] = value
这样的情况下,字典不使用set then get(如果它扩展到dictionary['x'] = value; x = dictionary['x']
则会这样做)而是只设置字典值。【参考方案2】:
使用dis
(反汇编)模块,此输出进一步支持@refp 的答案:
>>> def a(x):
... g = h = x
...
>>> import dis
>>> dis.dis(a)
2 0 LOAD_FAST 0 (x)
3 DUP_TOP
4 STORE_FAST 1 (g)
7 STORE_FAST 2 (h)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
RHS 被检索和复制,然后从左到右存储到目标变量中(自己尝试使用e = f = g = h = x
)。
如果 RHS 是一个函数调用,其他一些发帖者会感到困惑,例如 a = b = fn()
- RHS 只评估一次,然后将结果分配给每个连续的变量。如果返回的值是可变的,例如列表或字典,这可能会导致不必要的共享。
对于那些使用threading
的人,需要注意的是,在多个显式赋值语句中,链式赋值形式没有暗示“原子性”——g 和 h 的赋值与另一个线程之间可能发生线程切换查看他们两个可以看到两个变量中的不同值。
从documentation, 7.2. Assignment statements、g
和h
是两个目标列表,x
是表达式列表:
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
赋值语句计算表达式列表(请记住,这可以是单个表达式或逗号分隔的列表,后者产生一个元组)并将单个结果对象分配给每个目标列表,从左到右。
【讨论】:
此从左到右的评估是否有任何文档可用? @AshwiniChaudhary 是的,我已经添加了文档中的相关摘录。【参考方案3】:好的,“链式分配”是我所追求的搜索词,但经过更多挖掘后,我认为它并不完全正确。但它比“赋值语句的特殊情况”更容易搜索。
The Wikipedia articlesenderle 链接到说:
在 Python 中,赋值语句不是表达式,因此不 返回一个值。相反,链式分配是一系列 具有多个目标的单个表达式的语句。这 分配从左到右执行,以便
i = arr[i] = f()
计算表达式f()
,然后将结果分配给最左边 目标,i
,然后将相同的结果分配给下一个目标,arr[i]
,使用i
的新值。
另一个blog post 说:
在 Python 中,赋值语句不返回值。链式 赋值(或者更准确地说,看起来像链式赋值的代码 声明)被承认和支持作为一个特例 赋值语句。
这对我来说似乎是最正确的,仔细阅读 the docs - 特别是 (target_list "=")+
- 这也说
赋值语句计算表达式列表 ... 并赋值 每个目标列表的单个结果对象,从左到 对。
因此,它并不是真正“从最右到左评估”——RHS 被评估,然后从最左边的目标分配到右——不是我能想到的任何真实世界(甚至是人为的)例子会有所作为。
【讨论】:
我的描述是从开发人员的角度出发的,正如您自己所说的那样:没有 真实世界 的场景,其中的措辞会导致不同的结果。或者好吧,现在我实际上可以想到一个.. 等等,我会用一点 sn-p 来更新我的答案来解释我的意思。 没关系,这没有任何意义(如果没有大量的 python hack 就无法完成,这超出了问题的范围),尽管我会用来自的一些信息来更新我的答案你的帖子。 请记住,这不像一个普通的论坛,您可以用新的答案回复以前的帖子,如果您对某个帖子中的内容有意见,请使用“评论”功能,引用如果稍后删除/更改某个帖子,则您帖子中的另一个答案可能会造成麻烦。 @refp 我知道如何使用 Stack Overflow。我没有回复您的答案,它促使我进行更多挖掘并找到自己的答案。上次我检查这是正确的做事方式 - blog.***.com/2011/07/… 显示顺序的人为示例可能很重要:x = [0, 1, 2, 3]; x[0:2] = x[1:3] = [4];
结果为 [4, 4]
,如果您反转它们,则结果为 [4, 3]
。【参考方案4】:
由于我的无知,今天被python的Chained Assignment咬了。在代码中
if l1.val <= l2.val:
tail = tail.next = l1 # this line
l1 = l1.next
我的预期是
tail.next = l1
tail = tail.next
# or equivalently
# tail = l1
而我在下面,这会在列表中产生一个自我循环,让我陷入无限循环,哎呀......
tail = l1
tail.next = l1 # now l1.next is changed to l1 itself
因为对于 a = b = c, 一种方式(例如python)相当于
tmp = evaluate(c)
evaluate(a) = tmp
evaluate(b) = tmp
两个赋值的右操作数相等。
另一个(例如C++)等价于
evaluate(b) = evaluate(c)
evaluate(a) = evaluate(b)
因为在这种情况下a = b = c
基本上是
b = c
a = b
两个右手操作数可能不同。
这就是为什么类似的代码在 C++ 中运行良好的原因。
【讨论】:
一样!我认为依赖这种排序不是pythonic(我对“棘手”感兴趣,而不是确定它会起作用),任何读者都不会100%这样做。在这种情况下最好是明确的。 pythonic 的方法是使用元组分配/解包(如果我正确阅读了您的预期代码):tail, tail.next = tail.next, l1
。 RHS 得到全面评估,然后从左到右分配到 LHS 元组中。以上是关于python语言中的如何输入编号叫啥的主要内容,如果未能解决你的问题,请参考以下文章
python能开发出exe电脑软件吗?golang编程可开发出APK安卓应用?不用安装的程序叫啥
如何扫描目录中的文件夹并在末尾获取最高编号的文件夹-python