盘一盘 Python 系列 1 - 入门篇 (上)(二)

简介: 盘一盘 Python 系列 1 - 入门篇 (上)(二)

本文首发于“生信补给站”公众号 https://mp.weixin.qq.com/s/-x2V_41lJlQX4xp8GXPKLA

正则表达式

正则表达式 (regular expression) 主要用于识别字符串中符合某种模式的部分,什么叫模式呢?用下面一个具体例子来讲解。


input = """'06/18/2019 13:00:00', 100, '1st';'06/18/2019 13:30:00', 110, '2nd';'06/18/2019 14:00:00', 120, '3rd'"""input
"\n'06/18/2019 13:00:00', 100, '1st';
 \n'06/18/2019 13:30:00', 110, '2nd';
 \n'06/18/2019 14:00:00', 120, '3rd'\n"


假如你想把上面字符串中的「时间」的模式来抽象的表示出来,对照着具体表达式 '06/18/201913:00:00' 来看,我们发现该字符串有以下规则:


  1. 开头和结束都有个单引号 '
  2. 里面有多个 0-9数字
  3. 里面有多个正斜线 /分号 :
  4. 还有一个空格


因此我们用下面这样的模式


pattern = re.compile("'[0-9/:\s]+'")


再看这个抽象模式表达式 '[0-9/:\s]+',里面符号的意思如下:


  • 最外面的两个单引号 ' 代表该模式以它们开始和结束
  • 中括号 [] 用来概括该模式涵盖的所有类型的字节
  • 0-9 代表数字类的字节
  • / 代表正斜线
  • : 代表分号
  • \s 代表空格
  • [] 外面的加号 + 代表 [] 里面的字节出现至少 1 次


有了模式 pattern,我们来看看是否能把字符串中所有符合 pattern 的日期表达式都找出来。


pattern.findall(input)
["'06/18/2019 13:00:00'",
 "'06/18/2019 13:30:00'",
 "'06/18/2019 14:00:00'"]


结果是对的,之后你想怎么盘它就是你自己的事了,比如把 / 换成 -,比如用 datetime 里面的 striptime() 把日期里年、月、日、小时、分钟和秒都获取出来。



2.2 元组


创建元组

「元组」定义语法为


(元素1, 元素2, ..., 元素n)


关键点是「小括号 ()」和「逗号 ,


  • 小括号把所有元素绑在一起
  • 逗号将每个元素一一分开


创建元组的例子如下:





t1 = (1, 10.31, 'python')t2 = 1, 10.31, 'python'print( t1, type(t1) )print( t2, type(t2) )
(1, 10.31, 'python') <class 'tuple'>
(1, 10.31, 'python') <class 'tuple'>


知识点

创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。此外对于含单个元素的元组,务必记住要多加一个逗号,举例如下:




print( type( ('OK') ) )  # 没有逗号 , print( type( ('OK',) ) ) # 有逗号 ,
<class 'str'>
<class 'tuple'>



看看,没加逗号来创建含单元素的元组,Python 认为它是字符。


当然也可以创建二维元组:



nested = (1, 10.31, 'python'), ('data', 11)nested
((1, 10.31, 'python'), ('data', 11))


索引和切片

元组中可以用整数来对它进行索引 (indexing) 和切片 (slicing),不严谨的讲,前者是获取单个元素,后者是获取一组元素。接着上面二维元组的例子,先看看索引的代码:



nested[0]print( nested[0][0], nested[0][1], nested[0][2] )
(1, 10.31, 'python')
1 10.31 python


再看看切片的代码:


nested[0][0:2]
(1, 10.31)


不可更改

元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,例子如下 (注意「元组不支持元素赋值」的报错提示)。



t = ('OK', [1, 2], True)t[2] = False
TypeError: 'tuple' object does not support item assignment


但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。如下例 t[1] 是列表,其内容可以更改,因此用 append 在列表后加一个值没问题。


t[1].append(3)
('OK', [1, 2, 3], True)


内置方法

元组大小和内容都不可更改,因此只有 count 和 index 两种方法。




t = (1, 10.31, 'python')print( t.count('python') )print( t.index(10.31) )
1
1


这两个方法返回值都是 1,但意思完全不同


  • count('python') 是记录在元组 t 中该元素出现几次,显然是 1 次
  • index(10.31) 是找到该元素在元组 t 的索引,显然是 1


元组拼接

元组拼接 (concatenate) 有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。



(1, 10.31, 'python') + ('data', 11) + ('OK',)(1, 10.31, 'python') * 2
(1, 10.31, 'python', 'data', 11, 'OK')
(1, 10.31, 'python', 1, 10.31, 'python')


解压元组

解压 (unpack) 一维元组 (有几个元素左边括号定义几个变量)




t = (1, 10.31, 'python')(a, b, c) = tprint( a, b, c )
1 10.31 python


解压二维元组 (按照元组里的元组结构来定义变量)




t = (1, 10.31, ('OK','python'))(a, b, (c,d)) = tprint( a, b, c, d )
1 10.31 OK python


如果你只想要元组其中几个元素,用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。





t = 1, 2, 3, 4, 5a, b, *rest, c = tprint( a, b, c )print( rest )
1 2 5
[3, 4]


如果你根本不在乎 rest 变量,那么就用通配符「*」加上下划线「_」,刘例子如下:



a, b, *_ = tprint( a, b )
1 2


优点缺点

优点:占内存小,安全,创建遍历速度比列表快,可一赋多值。


缺点:不能添加和更改元素。


等等等,这里有点矛盾,元组的不可更改性即使优点 (安全) 有时缺点?确实是这样的,安全就没那么灵活,灵活就没那么安全。看看大佬廖雪峰怎么评价「不可更改性」吧


immutable 的好处实在是太多了:性能优化,多线程安全,不需要锁,不担心被恶意修改或者不小心修改。


后面那些安全性的东西我也不大懂,性能优化这个我可以来测试一下列表和元组。列表虽然没介绍,但是非常简单,把元组的「小括号 ()」该成「中括号 []」就是列表了。我们从创建、遍历和占空间三方面比较。



创建



%timeit [1, 2, 3, 4, 5]%timeit (1, 2, 3, 4, 5)
62 ns ± 13.2 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
12.9 ns ± 1.94 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)


创建速度,元组 (12.9ns) 碾压列表 (62ns)。



遍历





lst = [i for i in range(65535)]tup = tuple(i for i in range(65535))%timeit for each in lst: pass%timeit for each in tup: pass
507 µs ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
498 µs ± 18.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


遍历速度两者相当,元组 (498 µs) 险胜列表 (507 µs)。



占空间




from sys import getsizeofprint( getsizeof(lst) )print( getsizeof(tup) )
578936
524328


列表比元组稍微废点内存空间。



2.3 列表


创建列表

「列表」定义语法为


[元素1, 元素2, ..., 元素n]


关键点是「中括号 []」和「逗号 ,


  • 中括号把所有元素绑在一起
  • 逗号将每个元素一一分开


创建列表的例子如下:



l = [1, 10.31,'python']print(l, type(l))
[1, 10.31, 'python'] <class 'list'>


内置方法

不像元组,列表内容可更改 (mutable),因此附加 (append, extend)、插入 (insert)、删除 (remove, pop) 这些操作都可以用在它身上。



附加





l.append([4, 3])print( l )l.extend([1.5, 2.0, 'OK'])print( l )
[1, 10.31, 'python', [4, 3]]
[1, 10.31, 'python', [4, 3], 1.5, 2.0, 'OK']


严格来说 append 追加,把一个东西整体添加在列表后,而 extend 扩展,把一个东西里的所有元素添加在列表后。对着上面结果感受一下区别。



插入



l.insert(1, 'abc') # insert object before the index positionl
[1, 'abc', 10.31, 'python', [4, 3], 1.5, 2.0, 'OK']


insert(i, x) 在编号 i 位置前插入 x。对着上面结果感受一下。



删除



l.remove('python') # remove first occurrence of objectl
[1, 'abc', 10.31, [4, 3], 1.5, 2.0, 'OK']





p = l.pop(3) # removes and returns object at index.  Only only pop 1 index position at any time.print( p )print( l )
[4, 3]
[1, 'abc', 10.31, 1.5, 2.0, 'OK']


remove 和 pop 都可以删除元素


  • 前者是指定具体要删除的元素,比如 'python'
  • 后者是指定一个编号位置,比如 3,删除 l[3] 并返回出来


对着上面结果感受一下,具体用哪个看你需求。


切片索引

索引 (indexing) 和切片 (slicing) 语法在元组那节都讲了,而且怎么判断切片出来的元素在字符那节也讲了,规则如下图:



对照上图看下面两个例子 (顺着数和倒着数编号):



l = [7, 2, 9, 10, 1, 3, 7, 2, 0, 1]l[1:5]
[2, 9, 10, 1]



l[-4:]
[7, 2, 0, 1]


列表可更改,因此可以用切片来赋值。



l[2:4] = [999, 1000]l
[7, 2, 999, 1000, 1, 3, 7, 2, 0, 1]


切片的通用写法是


start : stop : step

相关文章
|
26天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
27天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
51 11
|
23天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
23天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
23天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
29天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
84 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
13天前
|
设计模式 缓存 开发者
Python中的装饰器:从入门到实践####
本文深入探讨了Python中强大的元编程工具——装饰器,它能够以简洁优雅的方式扩展函数或方法的功能。通过具体实例和逐步解析,文章不仅介绍了装饰器的基本原理、常见用法及高级应用,还揭示了其背后的设计理念与实现机制,旨在帮助读者从理论到实战全面掌握这一技术,提升代码的可读性、可维护性和复用性。 ####
|
23天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
26 3
|
26天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
25天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。