前言

看别人的源码时总感觉高大上,看自己写的代码,总感觉有点廉价感,总是不那么顺眼,那该如何提高自己的编程质量,让代码看起来更高雅呢?那咱们除了掌握根底知识,还需求掌握一些高阶用法。

根底知识

变量常见用法

变量解包

变量解包是Python里的一种特殊赋值操作,答应咱们把一个可迭代目标(比方列表)的所有成员,一次性赋值给多个变量,像这样

usernames = ['honey', 'jack']
author, reader = usernames

假如有多层嵌套数据,咱们能够添加小括号(),像这样

usernames = [['honey', 90], ['jack', 100]]
(author, author_score), (reader, reader_score) = usernames

动态解包,用星号表达式(*variables)作为变量名,它便会贪婪地捕获多个值目标,并将捕获到的内容作为列表赋值给variables,像这样

usernames = ['honey', 90, 100, 'jack']
author, *score, reader = usernames
print(score) # [90, 100]
单下划线变量名_

它常作为一个无意义的占位符出现在赋值句子中。_这个姓名本身没什么特别之处,这算是咱们约定俗成的一种用法。像这样

usernames = ['honey', 90, 100, 'jack']
author, *_, _ = usernames
给变量注明类型

在Python 3.5版别今后,能够用类型注解功能来直接注明变量类型。像这样

from typing import Listdef remove_invalid(items: List[int]):
 """移除无效元素"""
 ......

当然,“类型注解”只是一种有关类型的注释,不提供任何校验功能。要校验类型正确性,需求运用其他静态类型检查工具(如mypy等)

变量命名

Python拟定了官方的编码风格攻略:PEP 8。其间变量的命名规范如下:

  • 关于一般变量,运用蛇形命名法,比方max_value;

  • 关于常量,采用全大写字母,运用下划线连接,比方MAX_VALUE;

  • 假如变量标记为“仅内部运用”,为其增加下划线前缀,比方_local_var

  • 当姓名与Python要害字抵触时,在变量结尾追加下划线,比方class

    除变量名以外,PEP 8中还有许多其他命名规范,比方类名应该运用驼峰风格(FooClass)、函数应该运用蛇形风格(bar_function),等等。

小技巧

匹配类型:

匹配布尔值类型,像这样is_admin has_errors allow_empty

匹配int/float类型,像这样age port user_id users_count length_of_username

数值根底

界说数值字面量时,假如数字特别长,能够经过插入_分隔符来让它变得更易读,像这样

#以"千"为单位分隔数字
i = 1_000_000
浮点数精度问题

看这段代码:

print(0.1   0.2) # 0.30000000000000004

能够看到成果并不是0.3,这便是因为浮点数精度导致的。

为了解决这个问题,Python提供了一个内置模块:decimal。它在做四则运算时不会丢失任何精度:

from decimal import Decimal
​
# 留意0.10.2有必要是字符串 
print(Decimal('0.1')   Decimal('0.2'))

在运用Decimal的过程中,咱们需求留意:有必要运用字符串来表明数字。假如你提供的是一般浮点数而非字符串,在转换为Decimal目标前就会丢失精度,掉进所谓的“浮点数陷阱”,像这样

from decimal import Decimal
​
print(Decimal(0.1)) # 0.1000000000000000055511151231257827021181583404541015625
布尔值其实也是数字

布尔类型其实是整型的子类型,在绝大多数情况下,True和False这两个布尔值能够直接当作1和0来运用。像这样

print(True   1) # 2

这个特点,能够用来计算总数,比方:一个包括整数的列表,我需求计算列表里一共有多少个偶数

看到这个题目,正常思想,写一个循环判别完成计算,但利用这个特点能够简化代码,像这样

numbers = [1, 2, 3, 4, 5, 6, 7]
count = sum(i % 2 == 0 for i in numbers)

字符串常用操作

当做序列操作

遍历字符串

s = "hello, python!"
for c in s:
  print(c)

切片

s = "hello, python!"
# 回转字符串
s[::-1]

当然回转字符串也能够运用内置办法reversed完成

''.join(reversed(s))

reversed会回来一个可迭代目标,经过字符串的.join办法能够将它转换为字符串

格局化

三种格局化办法:

1、C语言风格的根据百分号%的格局化句子 'hello, %s' % 'python'。这种办法不推荐

2、(str.format)办法(Python 2.6新增):”Hello,{}”.format (‘World’)。

3、f-string(Python 3.6新增)

name = 'python';
print(f'Hello, {name}')。

str.format的共同之处:支撑用方位参数来格局化字符串,完成对参数的重复运用,像这样

print('{0}: name={0} score={1}'.format('jack', 100)) # jack: name=jack score=100
拼接多个字符串

运用join,像这样

output = ['hello', 'python']
print(' '.join(s for s in output))

当然还有另一种办法 =

切分字符串

splitpartition

output = "name:jack"
print(output.split(':')) # ['name', 'jack']
print(output.partition(":")) # ('name', ':', 'jack')

可与看到,他们回来的成果会有所不同,split回来一个列表,partition回来一个包括三个成员的元组:(part_before, sep, part_after),它们分别代表分隔符前的内容、分隔符以及分隔符后的内容。

替换字符

replace替换单个字符

s = 'hello, python.'
print(s.replace(',', '!')) # hello! python.

当咱们需求替换多个字符时,能够运用translate,像这样

s = 'hello, python.'
# 创建替换规矩表:',' -> ',', '.' -> '。'
table = s.maketrans(',.', '!。')
print(s.translate(table)) # hello! python。
字符串与字节串

1、字符串(str)类型,运用Unicode标准,可经过.encode()办法编码为字节串

2、字节串(bytes)类型,bytes必定包括某种真实的字符串编码格局(默认为UTF-8),可经过.decode()解码为字符串

案例:

# 字符串
s = 'hello, python.'
byte_s = s.encode('UTF-8') # b'hello, python.'# 字节串
byte_object = b'hello'
print(type(byte_object)) # <class 'bytes'>
print(byte_object.decode()) # hello

当你要把字符串写入文件时,请谨记:一般字符串采用的是文本格局,无法直接存放于外部存储,必定要将其编码为字节串——也便是“二进制字符串”——才行。这个编码作业有时需求显式去做,有时则隐式发生在程序内部。比方在写入文件时,只要经过encoding参数指定字符串编码格局,Python就会主动将写入的字符串编码为字节串,像这样

#经过 encoding指定字符串编码格局为 UTF-8
with open('output.txt', 'w', encoding='UTF-8') as fp:
  fp.write("hello python")

假如未指定encoding,Python会尝试主动获取当前环境下偏好的编码格局,笔者的电脑为Mac,这个编码办法为UTF-8,验证一下:

import locale
​
print(locale.getpreferredencoding()) # UTF-8

最后

实际编程中咱们要故意去练习这些技巧,才干逐渐写出高雅的代码,期望咱们都提前成为python大神。