python算法

python3 mro

十年热恋 提交于 2020-03-09 10:58:13
我们知道, Python 类是支持(多)继承的,一个类的方法和属性可能定义在当前类,也可能定义在基类。针对这种情况,当调用类方法或类属性时,就需要对当前类以及它的基类进行搜索,以确定方法或属性的位置,而搜索的顺序就称为方法解析顺序。 方法解析顺序(Method Resolution Order),简称 MRO。对于只支持单继承的编程语言来说,MRO 很简单,就是从当前类开始,逐个搜索它的父类;而对于 Python,它支持多继承,MRO 相对会复杂一些。 实际上,Python 发展至今,经历了以下 3 种 MRO 算法,分别是: 从左往右,采用深度优先搜索(DFS)的算法,称为旧式类的 MRO; 自 Python 2.2 版本开始,新式类在采用深度优先搜索算法的基础上,对其做了优化; 自 Python 2.3 版本,对新式类采用了 C3 算法。由于 Python 3.x 仅支持新式类,所以该版本只使用 C3 算法。 有关旧式类和新式类的讲解,可阅读《 Python super()使用注意事项 》一文。 有读者可能会好奇,为什么 MRO 弃用了前两种算法,而选择最终的 C3 算法呢?原因很简单,前 2 种算法都存在一定的问题。 旧式类MRO算法 在使用旧式类的 MRO 算法时,以下面代码为例(程序一): class A : def method (self ): print (

Python的输入与输出、Python输入EOF判断

那年仲夏 提交于 2020-03-09 07:39:16
输入采用input()方法。input输入的元素都是以str形式保存的。输出采用print()方法。 Python中没有代表EOF的字符,因此检测到输入EOF时会直接报错EOFerror。因此我们要采用下面的写法来检测输入到EOF后停止循环输入: while True: try: s = int(input()) print(s) except: print('input complete') break 1 2 3 4 5 6 7 如果在cmd.exe中运行这段代码,输入Ctrl+Z即可停止输入。如果是在Pycharm内建运行框中运行这段代码,输入Ctrl+D即可停止输入。 如果是在Python中读取文件,Python到读取到文件结尾后是返回空字符串的,所以python可以这样判断: str = '' with open('readme.txt', 'r', encoding='utf-8') as fp: while True: s = fp.read(10) if s == '': break str += s print(str) 1 2 3 4 5 6 7 8 Python字符串类型、空值类型、Unicode编码、UTF-8编码、格式化字符串 字符串是以单引号’或双引号"括起来的任意文本。如果字符串内部既包含’又包含",可以用转义字符\来标识。\n表示换行,\t表示制表符

01: 数组

我们两清 提交于 2020-03-09 00:39:53
算法面试其他篇 目录: 1.1 简单数组题   1、去除列表中相加等于指定数后的列表(x+y=4)       [1,3,5,7,1,2] ==> [5,7,1,2] [1,3,3,5,7,1,2] ==> [3,5,7,1,2] #! /usr/bin/env python # -*- coding: utf-8 -*- def func(l, tag=4): for i in range(len(l)): a = l[i] if a != None: b = tag - a try: index = l.index(b) if index != i: # 避免 2 + 2 = 4只有一个2也没重置为None l[i] = None l[index] = None else: if l.count(b) > 2: # 如果有两个就都重置为 None l[i] = None l[l.index(b)] = None except Exception as e: pass print l # [None, None, 5, 7, 1, 2] while None in l: l.remove(None) return l # [5, 7, 1, 2] l = [1,3,5,7,1,2] print func(l, 4) ''' [1,3,5,7,1,2] [None, None, 5

使用timeit测试Python函数的性能

☆樱花仙子☆ 提交于 2020-03-08 23:59:16
timeit是Python标准库内置的小工具,可以快速测试小段代码的性能。 认识timeit timeit 函数: timeit.timeit(stmt, setup,timer, number) 参数说明: stmt: statement的缩写,你要测试的代码或者语句,纯文本,默认值是 "pass" setup: 在运行stmt前的配置语句,纯文本,默认值也是 "pass" timer: 计时器,一般忽略这个参数 number: stmt执行的次数,默认是1000000,一百万 repeat 函数: timeit.repeat(stmt, setup, timer, repeat, number) 是timeit的repeat版,可以指定重复timeit的次数,默认是3次,然后返回一个数组。 举一个简单的例子来说明用法: import timeit print(timeit.timeit('output = 10*5')) # 0.014560436829924583 print(timeit.repeat('output = 10*5')) # [0.01492984383367002, 0.01342877489514649, 0.013638464966788888] 嗯,看上去没毛病,实际上谁也不会去测没有意义的加减乘除,我们需要测试自己的代码。 测试多行代码

python课程之猴子爬山算法

坚强是说给别人听的谎言 提交于 2020-03-08 18:42:23
【问题描述】 猴子爬山一只顽猴在一座有N级台阶的小山上爬山跳跃。上山时需从山脚至山顶往上跳N级台阶,一步可跳1级,或跳2级,或跳3级,求上山有多少种不同的跳法? (N<1000) 【输入形式】 请输入台阶数: 【输出形式】 跳法数:xxxx 【样例输入】 请输入台阶数:20 【样例输出】 跳法数:121415 问题分析: 每一次都可以选择1,2,3有3种跳法 直接使用递归 jumpWay = [1, 2, 3] footstep = input() jumping = 0 #first write def jump(nowstep, footstep, jumpWay): if nowstep == footstep: global jumping jumping += 1 return elif nowstep > footstep: return else: for i in range(len(jumpWay)): jump(nowstep + jumpWay[i], footstep, jumpWay) jump(0, footstep, jumpWay) print(jumping) 但是效率过于低 想办法对算法进行合理优化,我第一时间想到的是树,这是一颗每个节点都有3个叶子节点(除了最后几个)。而画出来的树又有很多重复的树结构,我就便想到斐波那契数列。

python算法日记(链表系列)_leetcode 142. 环形链表 II

感情迁移 提交于 2020-03-08 10:43:56
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:tail connects to node index 0 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:no cycle 解释:链表中没有环。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle-ii 方法一:利用集合(set)的无序的不重复元素序列的特性。把visited的节点存在set里,延用环形链表 I的做法 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next

元类metaclass

依然范特西╮ 提交于 2020-03-08 03:09:52
一 前言 二 什么是元类 三 class关键字创建类的流程分析 五 自定义元类控制类OldboyTeacher的创建 六 自定义元类控制类OldboyTeacher的调用 六 再看属性查找 七 练习题 一 前言 元类属于python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也只是自圆其说、点到为止,从对元类的控制上来看就破绽百出、逻辑混乱,今天我就来带大家来深度了解python元类的来龙去脉。 笔者深入浅出的背后是对技术一日复一日的执念,希望可以大家可以尊重原创,为大家能因此文而解开对元类所有的疑惑而感到开心!!! 二 什么是元类 一切源自于一句话:python中一切皆为对象。让我们先定义一个类,然后逐步分析 class OldboyTeacher(object): school='oldboy' def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s says welcome to the oldboy to learn Python' %self.name) 所有的对象都是实例化或者说调用类而得到的(调用类的过程称为类的实例化),比如对象t1是调用类OldboyTeacher得到的 t1=OldboyTeacher('egon',18)

Python实现数据结构与算法——和为s的连续正数序列

旧街凉风 提交于 2020-03-07 18:39:29
题目描述: 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 示例1: 输入:target = 9 输出: [ [ 2 , 3 , 4 ] , [ 4 , 5 ] ] 示例2: 输入:target = 15 输出: [ [ 1 , 2 , 3 , 4 , 5 ] , [ 4 , 5 , 6 ] , [ 7 , 8 ] ] 限制: 1 <= target <= 10 ^ 5 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路: 连续正数序列的最大值不会超过target/2 等差序列求和公式,可以求得首末尾正数的关系,记作x和y 从1到int(target/2)遍历x,找出满足使y为整数的x,即x和y为序列的首尾数。代码如下: import math class Solution : def findContinuousSequence ( self , target : int ) : result = [ ] for i in range ( int (

【Python】学习笔记(三):机器学习基础入门

冷暖自知 提交于 2020-03-07 04:04:06
机器学习简介 1 机器学习 1.1 数据集 数据集 = 特征值 + 目标值 1.2 算法分类 监督学习 目标值:类别 - 分类问题 目标值:连续数据 - 回归问题 无监督学习 :无目标值 1.3 机器学习流程 1.4 Scikit-learn pip3 install Scikit-learn == 0.19.1 2 sklearn 特征工程 2.1 scikit-learn数据集API 2.2 数据集 2.2.1 小数据集 2.2.2 大数据集 2.2.3 返回值 # 导入鸢尾花 from sklearn . datasets import load_iris 2.2.4 数据集的划分 from sklearn . model_selection import train_test_split x_train , x_test , y_train , y_test = train_test_split ( iris . data , iris . target , test_size = 0.2 , random_state = 22 ) print ( f "测试集:{x_train}, 大小:{x_train.shape}" ) 2.3 特征工程 Feature Engineering sklearn 特征工程 pandas 数据清洗,数据处理 2.3.1 特征抽取API

python学习笔记

六眼飞鱼酱① 提交于 2020-03-06 04:28:42
目录 元组 函数参数 format 算法 元组 定义一个元素的元组. t = (1,) 逗号不能少 命名元组: from collections import namedtuple Student = namedtuple(‘Student’, ‘name age’) tom = Student(‘tom’, 20) tom.name 字符串: center/zfill/rjust/ljust 函数参数 顺序:普通参数、默认参数、可变位置参数、key-world only参数、关键字参数 def fun(x, y, z=1, *args, m, *kwargs): print(“x={0}, y={1}, z={2} m={3}”.format(x, y, z,m)) print(args) print(kwargs) format "{} {1} {xxx}".format(*agrs, **kwagrs) -> str args为位置参数;kwargs为关键字参数 "{0[0]}.{0[1]}".format(('a','com')) -> a.com from collections import namedtuple Point = namedtuple(‘Point’,‘x,y’) p = Point(4,5) “{{{0.x},{0.y}}}”.format§ ‘{4