Python进阶技巧二三事(七):字符串、python版本控制

零 Python教程评论82字数 2526阅读8分25秒阅读模式

Python进阶技巧二三事(七):字符串、python版本控制

str与unicode

Python2中有两种表示字符序列的类型,分别是str和unicode,str的实例的每个元素包含原始的8位二进制码,而unicode的实例,则包含Unicode字符。

在py3中文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

  • bytes是由8位二进制码组成的ascii串
  • str是包含Unicode字符的序列
  • 开发者不能通过 + 这种运算符来混合操作两种类型

在py2中文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

  • str是由8位二进制码组成的ascii串
  • unicode是一种包含Unicode字符的序列
  • 如果str只含有七位ascii字符,那么可以和unicode进行运算,因为unicode中包含这些字符,八位则不行

python

代码解读
复制代码
In [1]: a = 'a'

In [2]: b = u'b'

In [3]: print(type(a), type(b))
(<type 'str'>, <type 'unicode'>)

In [4]: 

In [4]: print(a+b)
ab

In [5]: c = 'x80'

In [6]: print(type(c))
<type 'str'>

In [7]: print(c+b)
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-7-daf5f87919e9> in <module>()
----> 1 print(c+b)

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte

如果想要把Unicode字符转换成二进制数据,那么就需要用到encode方法;反过来将二进制数据转换成str类型,需要用到decode方法。文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

python

代码解读
复制代码
def to_unicode(unicode_or_str):
  if instance(unicode_or_str, str):
      value = unicode_or_str.decode('utf-8')
  else:
      value = unicode_or_str
  return value      

arduino

代码解读
复制代码
def to_str(unicode_or_str):
  if instance(unicode_or_str, unicode):
      value = unicode_or_str.encode('utf-8')
  else:
      value = unicode_or_str
  return value    

pyenv

因为Python有两个大版本python2python3,而这两个版本之间相互又不兼容,很容易出现一些老项目使用的版本是python2,而我们在开发过程中又需要用到python3的情况,这时候pyenv就能给我们带来很多方便,这是一个能够快速管理、安装、切换python版本的工具。文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

安装文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

⚠️homebrew已经在很早的时候移除了Python2的安装,现在不能直接通过brew install python@2的方式进行安装了,推荐先安装pyenv,通过这个来安装具体的语言环境。文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

brew install pyenv文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

输入pyenv -h 如果看到下面这个列表就表示安装成功了文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

Python进阶技巧二三事(七):字符串、python版本控制文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

pyenv install 2.7.18 //Python2最后一个可商用的版本文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/17644.html

pyenv install 3.7.9

pyenv versions能看到现在使用的是系统指定版本

Python进阶技巧二三事(七):字符串、python版本控制

通过pyenv virtual env xxx分别创建不同版本的虚拟环境

Python进阶技巧二三事(七):字符串、python版本控制

python virtualenvs结果如下则ok

Python进阶技巧二三事(七):字符串、python版本控制

通过pyenv global xxx进行版本的切换

Python进阶技巧二三事(七):字符串、python版本控制

通过pyenv activate myenv-2.7进入虚拟环境,如果报错如下

Python进阶技巧二三事(七):字符串、python版本控制

那么需要在~/.bashrc或者~/.zshrc中添加下面这段环境变量设置

辅助函数取代复杂的表达式

Python的语法非常精炼,很容易就能用一行表达式来实现许多逻辑。用查询字段的key来举例子,在查询不同的参数时,可能会获得不同的返回值

less

代码解读
复制代码
print('Red:' , my_values.get('red')) 
print('Green:', my_values.get('green')) 
print('Opacity:', my_values.get('opacity')
>>>
Red : '5'
Green: ''
Opacity: None

现在要实现这个功能:如果待查询的参数没有出现在字符串中,或者当该参数的值为空白的时候,我们能够返回统一的默认值,比如None,这样能够使我们的调用层调用时更简单。

这个逻辑并不值得用完整的if语句或者辅助函数来实现,于是你可能会考虑用boolean表达式

随后上面的代码改成

less

代码解读
复制代码
print('Red:' , my_values.get('red')) or 0
print('Green:', my_values.get('green')) or 0
print('Opacity:', my_values.get('opacity') or 0
>>>
Red : '5' 
Green: 0
Opacity: 0
// Red有值 所以或运算之后的结果是原本的值'5'
// Green和Opacity的值为'' 和 None 
// 在或运算中都是False值 所以或运算结果为0

这样的表达式虽然语法正确,但是增加了开发者的阅读难度,而且有时未必完全符合要求,比如如果我们最终需要的结果是一个数字类型,那还需要再增加这个代码的长度

int(my_values.get('red')) or 0)

python 2.5版本之后添加了if/else条件表达式,也称作三元运算法,我们可以把上述逻辑写的更清晰一点,同时还能保持代码整洁

my_values.get('red')

int(red) if red else 0

总结

  • 开发者很容易过度使用Python的语法特性,要尽量避免写出特别复杂并且难以理解的单行表达式
  • 复杂的表达式需要单独移入到一个辅助函数中,如果要反复的使用相同的逻辑,就更应该这么做
  • 使用If/else表达式,比使用orand这种操作符表达式更加清晰

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/pythonjc/17644.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论