前言
看别人的源码时总感觉高大上,看自己写的代码,总感觉有点廉价感,总是不那么顺眼,那该如何提高自己的编程质量,让代码看起来更高雅呢?那咱们除了掌握根底知识,还需求掌握一些高阶用法。
根底知识
变量常见用法
变量解包
变量解包是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 List
def 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.1和0.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))
当然还有另一种办法 =
切分字符串
split
和partition
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大神。