>  기사  >  백엔드 개발  >  Python의 문자 인코딩 및 함수 사용에 대한 자세한 설명

Python의 문자 인코딩 및 함수 사용에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-02 09:42:591607검색

다음 편집기는 Python 문자 인코딩 및 함수의 기본 사용법에 대한 기사를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 에디터를 따라가서 함께 살펴볼까요

1. Python2의 문자 디코딩 및 인코딩 문제

현재 Python2를 사용하고 있다면 문자 인코딩 문제가 있다는 것을 모두 아셔야 합니다. Bar: Python2는 명령줄에서 직접 중국어를 인쇄할 수 없습니다. 물론, 대부분은 이해할 수 없는 왜곡된 문자를 보고할 것입니다. 중국어를 직접 표시하려면 Python2 파일의 헤더에 문자 인코딩 형식을 선언하면 됩니다. 아래 그림과 같이

여기서 #-*-coding:utf-8 -*- 는 다음 코드가 해석하는 데 사용되는 인코딩을 선언하는 데 사용됩니다.

1.1. :

인코딩과 디코딩의 세계에서는 누구나 아는 텍스트를 찾아야 합니다. 이런 식으로도 이해될 수 있습니다. 나는 중국인이고 지금 일본인과 대화하고 있습니다. 나는 그가 말하는 것을 확실히 이해할 수 없고 그도 이해할 수 없지만 다른 방법은 없습니까? 어쩌면 국제 언어인 영어가 필요할 수도 있습니다. 이렇게 하면 다른 나라의 사람들이 의사소통을 할 수 있습니다(물론 당신이 괜찮은지 알지만). 인코딩에서도 마찬가지입니다. gbk나 utf-8은 상대방의 형식이 무엇을 의미하는지 모릅니다. 따라서 gbk를 사용하여 utf-8의 인코딩을 이해하려면 utf-8을 유니코드로 디코딩해야 하며 유니코드는 gkb를 알고 있습니다. 여기서 유니코드를 Python2에서 gbk


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


msg = "中国"
print msg

#解码在编码的过程,encoding是申明用申明这段代码是什么编码
gbk_str = msg.decode(encoding='utf-8').encode(encoding='gbk')
print gbk_str

#其实两种输出的结果是一样的

로 인코딩해야 합니다. 기본적으로 IDE에서 코드를 해석하는 데에는 gbk가 사용되므로 Python 명령줄에서 중국어를 직접 입력하는 것은 불가능하므로 #-*-coding:utf-8 -*-를 사용하여 헤더를 선언합니다. 다음 코드를 어떤 언어로 설명할 수 있나요? 주의 깊은 사람들은 문제를 발견했을 것입니다. 명령줄에 오류가 보고되지 않더라도 명령문 헤더는 utf-8만을 사용하여 여기서 직접 출력됩니다. 모두, DOS 명령 라인의 기본 지원은 gbk 형식의 문자 코드입니까? 여기에는 또 다른 개념이 포함됩니다. Python이 메모리 인터프리터에 들어가면 기본적으로 유니코드가 사용됩니다. 파일이 메모리에 로드된 후 자동으로 유니코드로 디코딩됩니다. 유니코드는 외부 코드이므로 자연스럽게 utf-8 인코딩에서 또는 gbk 인코딩으로 변환될 수 있습니다. . 이제 Gu는 중국어를 표시할 수 있습니다.

PS: 결론은 다음과 같습니다. Python2에서는 디코딩 작업이 필요하지만 메모리가 유니코드

1.2이므로 인코딩은 필요하지 않습니다. Python3의 문자 인코딩 문제:

글쎄 , 다른 무엇을 말할 수 있습니까? Python3은 기본적으로 utf-8을 사용하여 코드를 해석합니다. 즉, 줄의 시작 부분에 #-*-coding:utf-8 -*- (GBM)이 나오므로 디코딩 문제가 없습니다. 하지만 utf-8 문자 인코딩 형식을 gbk로 인코딩하면 여기서 언급하겠습니다(사실 나중에 잊어버릴까 두렵습니다. 헤헤). 바이트 형식의 항목이 여기에 출력됩니다.

바이트란 정확히 무엇인가요? 여기서는 간략하게 이야기해보겠습니다. 실제로 이는 ASCII 코드에서 이 문자의 해당 위치입니다. 믿을 수 없다면 코드 스크린샷을 살펴보겠습니다.

이 그림에서 우리는 중국이 이해할 수 없는 새 문자들로 가득 차 있다는 것을 알 수 있습니다. 하지만 영어는 계속 표시됩니다. 그런데 리스트를 가로채는 것을 보면 마지막 비트 c의 출력이 99라는 것을 알 수 있다. 사실 여기서의 출력은 ASCII에서 c에 해당하는 위치이고, 3바이트는 한자이므로 6문단을 보게 된다. 여기서는 너무 많이 설명할 필요가 없습니다.

PS: 모두가 기억해야 할 한 가지는: Python2의 str은 Python3의 바이트 형식이고 Python2의 str은 실제로 유니코드입니다

2. Python3의 파일 작업 보완

2.1. "+"를 사용한 작업:

여기서 세 가지를 언급하겠지만 실제로는 거의 쓸모가 없으며 단지 지식 포인트일 뿐입니다.

r+: 읽을 수 있고 추가할 수 있습니다.
w+: 소스 파일을 지운 다음 write new content
a+: 추가, 읽을 수 있음


f = open('lyrics','r+',encoding='utf-8') #这里的lyrics是文件名字
f.read() #我先读取 
f.write("Leon Have Dream") #在后面追加
f.close()

r+: f.read()가 먼저이고 f.write()이면 파일 끝에 추가됩니다. write(직접)는 파일 시작 부분의 내용을 ()의 내용으로 직접 대체합니다.


f = open('lyricsback','w+',encoding='utf-8')
f.read()
f.write("Leon Have Dream")
f.read()
f.close()

w+: 실제로 내용을 지우고 write()의 내용을 다시 쓰는 것을 의미합니다. f.read ()는 오류를 보고하지 않습니다. 개인적인 제안은 직장을 그만두려고 할 때 이 작업을 수행할 수 있다는 것입니다


f = open('lyricsback','a+',encoding='utf-8')
f.read()
f.write("Leon Have A Draem")
f.read()
f.close()

a+: 실제로 읽을 수 있는 콘텐츠를 추가한다는 점에서 r+와 매우 유사합니다. 끝

PS:这里的补充一下,为什么在使用r+的时候先执行f.read()再执行f.write()就会在文件的结尾追加和直接使用f.write()直接就替换文件最前边的内容呢?这是因为Python在读文件的时候自己维护这一个“指针”,如果我们使用f.read()就相当于读完了这个文件,这时候指针也就会在最后面了。下面我在补充“f”这个对象的几个用法来证明Python文件指针。


f = open('lyricsback','r+' ,encoding='utf-8')
print(f.tell()) #this number is 0
f.seek(12) # 将指针向后面移动几个字节,一个汉字是三个字节
print(f.tell()) # this is seek number
f.write("Love Girl") #这里就从seek到地方替换
print(f.tell()) # tell()用法就是文件的指针位置
f.close()

2.2、加b的方式对文件进行操作

rb:将文件以二进制的方式从硬盘中读取出来,这里得记住在open()函数中不要加encoding= 这个参数因为二进制不存在编码上的问题

wb:将文件以二进制的方式写入内容,不过在f.write()中加上encode="utf-8",意思就是申明编码的格式,并且会清楚原来文件内容

ab:只能以二进制方式追加。

三、函数

什么是函数?函数可以简单理解一段命令的集合。为什么需要用函数?这里有一个非常简单的原因,比如说你需要对一段代码反复进行操作,这里你当然可以一直复制再粘贴,但是这样灵活性和日后的维护成本将会变大。


#比方说现在需要写一个报警(调用接口)的程序,这里就用监控做比喻

if cpu > 80%:
 连接邮箱服务器
 发送消息
 关闭连接

if memery > 80%:
 连接邮箱服务器
 发送消息
 关闭连接

if disk > 80%
 连接邮箱服务器
 发送消息
 关闭连接

#通过写这样的一个程序我们发现我们一直在重复调用发送邮箱的这一套接口。这样我们是否能想出一个办法解决这样的重复操作呢?请看下一个版本


发送邮件():
 l连接邮箱服务器
 发送连接
 关闭连接


if cpu > 80%
 发送邮件()

if memery > 80%:
 发送邮件()

....... # 这样以此类推,我们只需要挑用发送邮件的这个接口就可以节省代码的发送邮件了

通过上面的代码我们发现,我们只需要将报警的这一套流程放到一个公共的地方,等下面触发报警的条件的时候调用报警的函数,这样我们就可以省去当每次触发报警的时候我们自己在写报警的步骤了。但是函数是怎么定义呢?又有什么语法和定义呢?请看下面的一段代码,其中代码输出的是“Leon Have A Dream”


def leon(): #leon是函数名字
 print("Leon Have A Dream")

leon() #调用函数

带参数的函数:


a = 10
b = 5

def calc(a,b): 
 print(a ** b)

c = calc(a,b)
print(c)

首先上面这些代码执行完会输出两个字符,一个是10000,一个是None,为什么会这样呢?首先c是等于执行了一遍calc这个函数,所以输出10000这个数字是肯定的,但是为什么还会输出一个None呢?原来我们的“c”执行了仪表calc函数,而calc函数中没有任何的返回值,所以c == None 。

PS:函数的返回结果就是return,其中return的含义就是:把函数的执行结果返回给外面,从而让挑用函数的“对象”得到执行结果

下面我们在看与之相似的列子


a = 10
b = 5

def calc(a,b):
 print(a ** b)

 return a + b

c = calc(a,b)
c = calc(10,6)
print(c)

首先会输出的有三个值,分别是100000,1000000,16,为什么会是这三个呢,下面用一副图来说一下

PS:

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

Python中的全局变量和局部变量

PS:函数内部是可以修改列表,字典,集合,实例(class),我们通过下面一个图来说明

为什么列表和字典等会被添加和修改呢,原来函数内部知识引用了字典和列表的内存地址,而内存地址无法修改(可以重新开辟一块内存地址),而每个字典和列表中的每一个值都有对应的内存地址,但是记住我们函数是引用的列表或者字典本身的内存地址,所以这样打印到出来的也就会跟着改变了。

全局与局部变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:

在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

位置参数:

像上面这样实参和形参一一对应的上就是就是位置参数

默认参数:

在函数将一个位置参数设置成一个默认的值的那一个变量就是默认参数,记住默认参数得在位置参数得后面

关键参数:

像上面这样实参和形参不一一对应,并且在调用函数的时候给参数赋值的叫做关键参数

非固定函数:

通过输出结果我们发现*args是接收多余的字符串类型的参数,而想Python="simple"(字典)类型的会传入给**kwargs,这就是非固定参数;当你不知道这个参数需要多少个参数时可以使用该函数类型

递归函数——二分查找


a = [1,2,3,4,5,7,9,10,11,12,14,15,16,17,19,21]
def calc(num,find_num):
 print(num)
 mid = int(len(num) / 2)
 if mid == 0:
  if num[mid] == find_num:
   print("find it %s"%find_num)
  else:
   print("cannt find num")
 if num[mid] == find_num:
  print("find_num %s"%find_num)
 elif num[mid] > find_num:
  calc(num[0:mid],find_num)

 elif num[mid] < find_num:
  calc(num[mid+1:],find_num)
calc(a,12)

递归的特性

函数必须有明确的结束(判断)条件,也就是上图一开始的mid[0] 不能等于0,因为这样就会没有意义了

每次进入更深一层递归时,问题规模相比上次递归都应有所减少

递归函数每次向下递归一次,上次的函数占用的内存地址不会被释放,而是一直会被阻塞主,等待函数全部执行完毕后释放,所以也可以说递归是相当消耗内存空间的,对此Python有递归的深度,如果超过该深度函数将会被推出(栈溢出)

匿名函数:


calc = lambda x:x+2 # x是形参,冒号后的内容是该匿名函数执行的动作

print(calc(5))    #匿名函数意识需要通过调用来执行的

calc = lambda x,y,z:x*y*z #匿名函数可以传入多个形参,各个参数之间用逗号隔开
print(calc(2,4,6))
c = map(lambda x:x*2,[2,5,4,6]) #map方法需要 传入两个参数一个是function(函数),itrables(可迭代)的数据类型
for i in c:
 print(i)
#三元运算
for i in map(lambda x:x**2 if x >5 else x - 1,[1,2,3,5,7,8,9]): #lambda最多支持三元运算,map是直接调用匿名函数,但是如果想打印map的内容,需要循环
 print(i)

高阶函数:


def calc(x,y,f):
 print(f(x) + f(y))

calc(10,-10,abs)

高阶函数的特性

把一个函数的内存地址传给另外一个函数,当做参数

一个函数把另外一个函数的当做返回值返回

满足上面的这个两个特性中的一个就可以称为高阶函数,这里因为偷懒,就是直接调用了Python中的内置函数

위 내용은 Python의 문자 인코딩 및 함수 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.