python2.7和python 3.4中的ord函数有什么不同?

时间:2016-08-23 13:53:28

标签: python python-2.7 python-3.x

我一直在运行一个脚本,我使用SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(number, null, message, null, null); Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); 函数,无论出于什么原因在python 2.7中,它都接受unicode字符串字符,并且输出一个整数。

在python 3.4中,情况并非如此。这是正在产生的错误输出:

ord()

当我查看两个文档时,ord函数被解释为做同样的事情。

这是我用于两个python版本的代码:

Traceback (most recent call last):
  File "udpTransfer.py", line 38, in <module>
    buf.append(ord(c))
TypeError: ord() expected string of length 1, but int found

任何人都可以解释为什么python3.4它表示import socket,sys, ast , os, struct from time import ctime import time import csv # creating the udo socket necessary to receive data sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ip = '192.168.10.101' #i.p. of our computer port = 20000 # socket port opened to connect from the matlab udp send data stream server_address = (ip, port) sock.bind(server_address) # bind socket sock.settimeout(2) # sock configuration sock.setblocking(1) print('able to bind') ii = 0 shotNummer = 0 client = '' Array = [] byte = 8192 filename = time.strftime("%d_%m_%Y_%H-%M-%S") filename = filename + '.csv' try : with open(filename,'wb') as csvfile : spamwriter = csv.writer(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL) # spamwriter.writerow((titles)) # as long as data comes in, well take it while True: data,client = sock.recvfrom(byte) buf = [] values = [] for c in data: # print(type(c)) buf.append(ord(c)) if len(buf) == 4 : ### 是一个整数,而不是在Python 2.7中它实际上是一个字符串,正如c函数需要的那样?

2 个答案:

答案 0 :(得分:7)

您在Python 3中将整数传递给ord()。因为您在Python 3中迭代bytes对象(第一个元素)在socket.recvfrom())的元组返回值中:

>>> for byte in b'abc':
...     print(byte)
...
97
98
99

来自bytes type documentation

  

虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列[。]

  

由于字节对象是整数序列(类似于元组),对于字节对象 b b[0]将是一个整数[...]。

Python 2, socket.recvfrom()中生成一个str对象,并且对这样的对象进行迭代会产生新的单字符字符串对象,这些对象确实需要传递给ord()才能转换为整数。

你可以在这里使用bytearray()在Python 2和3中获得相同的整数序列:

for c in bytearray(data):
    # c is now in integer in both Python 2 and 3

在这种情况下,您根本不需要使用ord()

答案 1 :(得分:2)

我认为不同之处在于,在Python 3中,sock.recvfrom(...)调用返回字节,而Python 2.7 recvfrom返回字符串。所以ord没有改变,但传递给ord的内容已经改变了。

Python 2.7 recvfrom

Python 3.5 recvfrom