Python学习笔记
本专栏不定时分享一些Python 的基础知识,编程规范以及一些重难点、易错点等需要注意的地方。
码农谷阿莫
程序员的自我修养
展开
-
【Python基础】assert 语句
sss原创 2020-05-26 16:29:32 · 1198 阅读 · 1 评论 -
【Python实战】LeetCode141、142:判断链表中是否存在环
环形链表Ⅰ简单的版本,给定一个链表,判断链表中是否有环。环形链表Ⅱ原创 2020-05-22 17:14:51 · 349 阅读 · 0 评论 -
【Python基础】浅拷贝与深拷贝的区别
概括地说浅拷贝,是指重新分配一块内存,创建一个新的对象,里面的元素并非原对象本身的引用,而是原对象中第一层子对象的引用。因此,如果原对象中的元素是可变的,改变其也会影响拷贝后的对象,存在一定的副作用。浅拷贝有三种形式:切片操作、工厂函数、copy 模块中的 copy 函数。而深拷贝,是重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。因此,它的时间和空间开销要更高。深拷贝只有一种形式,copy 模块中的 deep原创 2020-05-18 17:07:11 · 237 阅读 · 0 评论 -
【Python基础】Python中参数传递,实际上是对象的引用传递
在 Python 中,万物皆对象。因此,和其他语言不同的是,Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者叫对象的引用传递。需要注意的是,这里的赋值传递或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象,只是让新变量与原变量指向相同的对象而已。也就是说,Python 里的对象可以被多个变量所指向或引用。对于可变对象(列表,字典,集合等等),当其改变时,所有指向这个对象的变量都会改变。对于不可变对象(字符串、整型、元组等等),简单的赋值只能改变其中一个变原创 2020-05-18 11:48:04 · 392 阅读 · 0 评论 -
【Python基础】“==” 操作符与 “is” 操作符的区别
等于(==)操作符和 is 操作符 是 Python 中对象比较常用的两种方式。简单来说:“==” 操作符比较的是两个对象之间的值是否相等;而 “is” 操作符比较的是对象的身份标识是否相等。在 Python 中,每个对象的身份标识,都能通过函数 id(object) 获得。因此,'is’操作符,相当于比较对象之间的 ID 是否相等,即它们是否为同一对象,是否指向同一个内存地址。注意点 1a = 10b = 10a == bTrueid(a)4427562448id(b)44原创 2020-05-17 23:55:04 · 767 阅读 · 0 评论 -
【Python实战】LeetCode22:生成有效的括号组合
题目描述解法一:暴力法n 对括号的组合,我们可以看成是生成一个长度为 2*n 的由 “(” 或 “)” 字符构成的序列,穷举所有可能的字符序列,每个位置上可能是放入 “(” 也可能是放入 “)” ,总共有 22n 种可能,然后检测每一个是否有效。class Solution(object): def generateParenthesis(self, n): """...原创 2020-04-15 00:24:22 · 996 阅读 · 0 评论 -
【Python实战】LeetCode130:被围绕的区域
题目描述这道题考察的是图上的搜索问题,通用的策略是深度优先搜索 DFS和广度优先搜索 BFS。题目中解释说被包围的区间不会存在于边界上,所以我们可以考虑对处于边界上或者连通边界的 O 进行特殊处理,那么剩下的 O 就是不在边界上或者不与边界上的 O 相连的 O,将它们替换成 X 就可以了。具体来说,我们可以先对连通边界的 O 替换成其它字符(比如 B),然后遍历整个图把剩下的没被替换的 O 替...原创 2020-04-12 17:57:48 · 408 阅读 · 0 评论 -
【Python实战】LeetCode104、111:二叉树的最大/最小深度
二叉树的最大深度解法一:广度优先搜索参考 LeetCode102 的解题思路,按层遍历树的所有节点,每遍历完一层,最大深度+1,直到最后一个叶子节点。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# ...原创 2020-04-11 22:46:18 · 1257 阅读 · 0 评论 -
【Python实战】LeetCode102:二叉树的层序遍历
题目描述如何遍历一棵树,通用的两种策略是:深度优先搜索和广度优先搜索。解法一:广度优先搜索 BFS这道题最容易想到的最法就是 BFS了,因为 BFS的定义本身就很类似按层遍历的思路,只不过对于这题目我们要注意的是,最后返回的是一个二维数组,每个子数组存放每一层的所有节点,因为我们在 BFS的遍历过程中要记下当前节点属于哪一层,从而存放到对应的子数组中。BFS一般采用的数据结构是队列,但是...原创 2020-04-11 17:03:18 · 423 阅读 · 0 评论 -
【Python实战】LeetCode235、236:验证二叉树的最近公共祖先
LeetCode236:二叉树的最近公共祖先递归求解# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = None...原创 2020-04-09 12:01:15 · 204 阅读 · 0 评论 -
【Python实战】LeetCode98:验证二叉搜索树
题目描述解法一:递归值得注意的是,对于一棵二叉搜索树中的每个节点,不仅右子结点要大于该节点,其整个右子树的节点都应该大于该节点。同理,每个节点不仅左子结点要小于该节点,其整个左子树的节点都应该小于该节点。因此,在遍历树的同时,需要保留每个节点的上界与下界,在比较时,不仅与子结点的值进行比较,也要与上下界比较。这里的上下界指的是,对于每个节点,其左子树的所有节点都有一个上界,都应该小于该节点...原创 2020-04-08 21:37:50 · 304 阅读 · 0 评论 -
【Python实战】LeetCode239:滑动窗口最大值
题目描述解法一:暴力法最简单直接的方法是遍历每个滑动窗口,找到每个窗口的最大值。假设数组的长度为n,则一共有 n - k + 1 个滑动窗口,每个滑窗有 k 个元素,于是算法的时间复杂度为 O(n*k),表现较差。class Solution(object): def maxSlidingWindow(self, nums, k): """ :typ...原创 2020-04-08 12:10:29 · 406 阅读 · 0 评论 -
【Python实战】LeetCode703、215、973: 详解 topK 系列问题
题目描述:数据流中的第K大元素解法一:排序这个题目本身并不难解决,最容易想到的方法就是每次数据流中加入一个新元素后,就对整个数组从大到小排序,然后返回排序好的第 K 个数字即为数组中第 K 大的元素。class KthLargest(object): def __init__(self, k, nums): """ :type k: int ...原创 2020-04-06 17:20:51 · 417 阅读 · 0 评论 -
【Python实战】LeetCode55:跳跃游戏
题目描述回溯法第一种比较容易想到的解法是:穷举从第一个位置跳到最后一个位置的所有可能方案。具体来说,从第一个位置开始,根据当前位置上的数值知道了在该位置上可以跳跃的最大长度,在(1~可跳跃最大长度)这个范围内枚举所有可以跳到的位置,每次选取一个跳跃长度并跳到下一个新的位置后,重复上述操作,当遇到当前位置上的数值为0,没有办法继续跳的时候,就回溯。class Solution(object)...原创 2020-04-01 01:08:00 · 410 阅读 · 0 评论 -
【Python实战】LeetCode15:三数之和
题目描述暴力法(超时)看到题目的第一想法,是最容易想到的暴力搜索法class Solution(object): def threeSum(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ result = [] ...原创 2020-03-30 23:14:34 · 407 阅读 · 1 评论 -
【Python基础】详解匿名函数 lambda 和函数式编程
匿名函数在实际工作中同样举足轻重,它们往往很简短,就一行,并且有个很酷炫的名字——lambda。正确地运用匿名函数,能让我们的代码更简洁、易读。匿名函数基础匿名函数的关键字是 lambda,之后是一系列的参数,然后用冒号隔开,最后则是由这些参数组成的表达式。lambda argument1, argument2,... argumentN : expression匿名函数 lambda ...原创 2020-02-18 14:10:22 · 485 阅读 · 0 评论 -
【Python基础】自定义函数、闭包
函数是 Python 程序中不可或缺的一部分。一个规范的 Python 程序,除非代码量很少(比如 10 行、20 行以下),基本都应该由多个函数组成,这样的代码才更加模块化、规范化。函数基础简单来说,函数就是为了实现某一功能的代码段,只要写好以后,就可以重复利用。Python 中的函数大概是下面的这种形式:def name(param1, param2, ..., paramN): ...原创 2020-02-17 00:14:47 · 284 阅读 · 0 评论 -
【Python基础】修炼基本功:条件与循环
“条件与循环”,是 Python 编程中的基本功。它控制着代码的逻辑,把列表、元祖、字典、集合和字符串等一系列 Python 的基本数据类型串接起来,可以说是程序的中枢系统。如果把写程序比作盖楼房,那么条件与循环就是楼房的根基,其他所有东西都是在此基础上构建而成。毫不夸张地说,写一手简洁易读的条件与循环代码,对提高程序整体的质量至关重要。Python 的条件语句1.和其他语言不一样,我们不能在...原创 2020-02-16 13:21:23 · 225 阅读 · 0 评论 -
【Python基础】文件 I/O,JSON 序列化
Python I/O 基础最简单直接的输入来自键盘操作,input() 函数暂停程序运行,同时等待键盘输入;直到回车被按下,函数的参数即为提示语。name = input('your name:')gender = input('you are a boy?(y/n)')welcome_str = 'Welcome to the matrix {prefix} {name}.'welc...原创 2020-02-15 01:00:47 · 332 阅读 · 0 评论 -
【Python基础】字符串的一些小 tricks
字符串同样是 Python 中很常见的一种数据类型,比如日志的打印、程序中函数的注释、数据库的访问、变量的基本操作等等,都用到了字符串。字符串基础字符串是由独立字符组成的一个序列,通常包含在单引号(’’)双引号(" “)或者三引号之中(’’’ ‘’'或”"" “”",两者一样),Python 中单引号、双引号和三引号的字符串是一模一样的,没有区别,同时支持这三种表达方式很重要的一个原因就是,方...原创 2020-02-14 00:41:55 · 205 阅读 · 0 评论 -
【Python基础】字典、集合的工作原理
字典(dict)和集合(set)是两个很常见的数据结构,并且相比列表(list)和元组(tuple),性能进行了高度优化,在 Python 中被广泛使用,其重要性不言而喻。字典和集合的定义字典(dict)是一系列由键(key)和值(value)配对组成的元素的集合,在 Python3.7+中,字典被确定为有序的(注:Python3.6 之前是无序的,而在 Python3.6 中字典有序是一个 ...原创 2020-02-13 02:02:36 · 418 阅读 · 0 评论 -
【Python基础】列表和元组,该怎么选择?
在绝大多数编程语言中,集合的数据类型必须一致。不过,对于 Python 的列表和元组来说,并无此要求。实际上,列表和元组,都是一个可以放置任意数据类型的线性表。它们的区别是:列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。而元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。如果想对已有的元组做任何的改变,那就是只能重新开辟一块内存,...原创 2020-02-11 22:38:20 · 362 阅读 · 2 评论