python算法

python 函数

[亡魂溺海] 提交于 2019-12-13 00:24:56
写程序六个字原则:高内聚 低耦合(high cohesion low coupling) 高内聚:写一个函数只做好一件事情 低耦合:一个函数尽量不要跟其他函数绑在一起 123456 def calc(items, fn): """计算函数,将+,-,*,/运算与函数解耦合""" result = items[0] for item in range(1, len(items)): result = fun(result, items[index]) return result 在python中函数是一等公民,函数可以赋值给变量,可以作为方法的参数和返回值 自定义规则就是解耦合操作 生成器() 浪费时间,调一次计算一次 存的是数据的产生方式,是一种算法 生成式[] 浪费空间 时间和空间是无法兼具的 12345678910111213141516 五个人分鱼,A把鱼分成5份,扔掉了多余的一条,拿走其中的一份,B把剩下的鱼又分成5份,扔掉多余的一条,拿走一份,C,D,E操作相同,问这堆鱼最少有多少条?fish = 0while True: enough = True amount = fish for _ in range(5): if (amount - 1) % 5 == 0: amount = (amount - 1) // 5 * 4 else: enough = False

六种常见排序算法(Python语言实现)

半世苍凉 提交于 2019-12-12 23:28:37
文章目录 排序算法总结 常见算法时间复杂度比较 冒泡排序 简介与工作原理: 代码实现 选择排序 插入排序 快速排序 希尔排序 归并排序 排序算法总结 常见算法时间复杂度比较 冒泡排序 简介与工作原理: 简介:是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 从第一个元素开始,与相邻的元素进行比较,如果比较结果是升序的,就把这两个元素进行互换 从第一对到最后一对进行比较,对每一对相邻元素重复进行此操作,做完这个操作后,最后一个元素是最大的元素 针对所以的元素再重复以上步骤 持续对越来越少的元素进行以上的步骤,直到没有任何一对数据需要比较为止。 代码实现 #!/usr/local/bin/python 2 # 冒泡排序 3 def bubb_sort ( list ) : 4 L = len ( list ) 5 for j in range ( L , 0 , - 1 ) : 6 for i in range ( j - 1 ) : 7 if list [ i ] > list [ i + 1 ] : 8 list [ i ] , list [ i + 1 ] = list [ i + 1

【原创】python协同过滤算法(基于用户)的demo

久未见 提交于 2019-12-12 17:57:10
python协同过滤算法(基于用户)的demo 0. 背景 有个协同过滤项目需要处理。从网上查阅资料,发现可用的资料不多。 发现一个简书的博客可以用,原文地址 传送门 , 数据地址 传送门 此处只谈代码,不考虑原理。 1. 经过 本着尝试的心态打开了代码,发现原文代码运行效率极低。原文博主认为是算法本身所导致。 我略经修改,主要利用numpy函数和一些自带函数,优化了原文博主语句,使得运算效果大大提高。 2. 代码 import numpy as np import pandas as pd from scipy . spatial . distance import pdist , squareform , cosine from sklearn . model_selection import train_test_split npa = np . array pd . set_option ( 'display.max_rows' , 500 ) pd . set_option ( 'display.max_columns' , 500 ) pd . set_option ( 'display.width' , 1000 ) moviesPath = ".\\ml-latest-small\\movies.csv" ratingsPath = ".\\ml-latest

python(三)高级特性切片迭代等

拟墨画扇 提交于 2019-12-11 21:03:51
切片:取一个list或tuple的部分元素是非常常见的操作 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] ##取前3个元素 L[0:3]=['Michael', 'Sarah', 'Tracy'] ##或 L=[:3] ##N个元素,也就是索引为0-(N-1)的元素 ## 可以从索引1开始,取出2个元素出来: >>> L[1:3] ['Sarah', 'Tracy'] ##L[-1]取倒数第一个元素,那么它同样支持倒数切片,倒数第一个元素是-1 不是从零开始 >>> L[-2:] ['Bob', 'Jack'] >>> L[-2:-1] ['Bob'] ##前10个数,每两个取一个: >>> L[:10:2] [0, 2, 4, 6, 8] 迭代 for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration) for ch in 'ABC': ... print(ch) ... A B C ###字典 dict 迭代(dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()) >>> d = {'a': 1, 'b': 2, 'c': 3} >>> for key in d: ...

Python笔记:模板方法模式

╄→гoц情女王★ 提交于 2019-12-11 00:18:26
此模式通过一个模板方法来定义程序的框架或算法,通常模板方法定义在基类中,即原始的模板,然后子类就可以根据不同的需要实现或重写模板方法中的某些算法步骤或者框架的某部分,最后达到使用相同模板实现不同功能的效果。 核心思想: 使用一个模板方法定义好总的算法框架。 子类中根据需要重新定义某些操作,但是不能修改原始模板方法。 在多个算法或框架具有类似或相同的逻辑的时候,可以使用模板方法模式,以实现代码重用。 当某些操作是强制子类必须实现的时候,此操作就可以定义为抽象方法,如果不是强制要求子类实现的话,则可以在基类中为它定义一个默认实现。 主要角色: 接口: 通常是抽象基类,定义模板方法中需要的各项操作。 模板方法: 即模板算法,定义好各项操作的执行顺序或算法框架。 真实对象: 子类通过重新实现接口中的各项操作,以便让模板方法实现不同的功能。 优缺点: 优点: 因为子类的实现是根据基类中的模板而来的,所以可以实现代码重用,因为有时候我们需要修改的只是模板方法中的部分操作而已。 缺点: 此模式的维护有时候可能会很麻烦,因为模板方法是固定的,一旦模板方法本身有修改的时候,就可能对其他的相关实现造成影响。 模板方法运用案例--钩子 钩子是在基类中声明的方法,并且在模板方法中使用它,通常是给它定义好一个默认的实现,钩子的思想是为子类提供一个按需“钩取”的能力,因此如果子类不想使用钩子

Python面向对象编程

杀马特。学长 韩版系。学妹 提交于 2019-12-10 23:44:25
Python面向对象编程 参考教程: https://www.bilibili.com/video/av8475172?p=1 面向过程与面向对象 面向过程:自顶向下,用于解决计算问题或实现某种算法,与我们的思考方式一致,拿到问题,思考问题, 设计步骤,得出结果。通过函数/过程操纵表现世界的数据与状态,运行效率较高。 面向对象:自底向上,把世界描绘成具有主动性的对象之间的交互,运行效率较低。 体会区别 例子:在一维地图上,有一只虫子和一只蚂蚁,每一次他们都走过一个-3,-2,2,+3,三个随机单位的距离,达到边界放弃移动,处于同一位置时,蚂蚁吃掉虫子,游戏结束。 面向过程 import random ant_point = random . randint ( 0 , 20 ) worm_point = random . randint ( 0 , 20 ) print ( "蚂蚁的位置:" , ant_point , ",虫子的位置:" , worm_point ) step = [ - 3 , - 2 , 2 , - 3 ] while ant_point != worm_point : go_step = random . choice ( step ) if 0 < ant_point + go_step < 20 : ant_point += go_step go

python-迭代器与生成器1

醉酒当歌 提交于 2019-12-10 22:14:23
python-迭代器与生成器1 迭代器与生成器 列表的定义 列表生成式:作用使代码更加简洁 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。 而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面 几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续 的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边 计算的机制,称为生成器:generator。 a=[1,2,3] print(a) a=[i*2 for i in range(10)] #也可以是传一个函数[fun for i rang(10)] print(a) #其他方式来完成: a=[] for i in range(10): a.append(i*2) print(a) 打印结果 [1, 2, 3] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 生成器:只有在调用时才会生成相应的数据,调用哪次就参生哪次。 只记录当前位置 只有一个方法_next_();2.7版本用netx(); (i*i for in in range(10))

高质量的Python代码--优化

▼魔方 西西 提交于 2019-12-10 15:22:24
小伙伴你的程序还是停留在糊墙吗?优化代码可以显示程序员的素质欧! 普及一下基础了欧: 一层for简写:y = [ 1, 2, 3, 4, 5, 6], [(i* 2) for i in y ] 会输出 [2, 4, 6, 8, 10, 12] ,标准形式为: [ 对i的操作 for i in 列表 ] 两层for循环:[对i的操作 for 单个元素 in 列表 for i in 单个元素], 例子: y_list = [ 'assss', 'dvv'] [print(i) for y in y_list for i in y] 输出:a s s s s d v v 相当于: y_list = ['assss','dvv']for y in y_list: for i in y: print(i) Python 代码优化常见技巧   代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗 80% 的工作量。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。 改进算法,选择合适的数据结构   一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进。在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(n lg n) -> O

Fedora 14下配置Python开发环境

自古美人都是妖i 提交于 2019-12-10 11:36:55
pythone新闻1则 Python十分适合解决很多简单的、有趣的问题,比用C语言要省力的多。(这是实话,几行Python代码你就能制作一个简单的拼写检查程 序。)你会发现这种语言里几乎没有任何复杂或让人困惑的东西,用它编程简单易懂,比如说数组更新你可以用固有的方法来实现任何的操作算法。在Python 里,你学习的曲线很平滑。数组,字典,集合是最主要的东西。 把Python当作入门语言,有一点需要注意:避免使用面向对象特征。你当 然不可能完全的回避它们,有些基本数据类型里一些有用的方法跟它们有关 联,问题不大。你只是使用它们已经提供的东西,不要去创建什么类,要避免任何的面向对象设计里的声明,否则的话,你一点点的数据都需要会打包成类 google未必能在移动搜索领域取得和网络搜索一样的支配地位 。 从面向过程到面向对象的转移带来后果是你从关注问题和解决方法转移到关注架构。你通过对比面向过程的程序和面向对象的程序,很容易能看出这点来。后者的 程序会更长,到处是多余的接口和缩进和标记。你也许忍不住想将一些小代码移进类里,或往类里添加一些小方法,这些都没必要,等日后你再做这些也不迟。 Fedora 14下配置Python开发环境 先装python,由于Fedora 14系统已有python,将python安装至home目录下; 修改home目录下.bash_profile文件

python timeit class Timer()

梦想的初衷 提交于 2019-12-10 05:21:10
#! /usr/bin/env python3 """Tool for measuring execution time of small code snippets. 用于测量小代码段执行时间的工具 This module avoids a number of common traps for measuring execution times. See also Tim Peters' introduction to the Algorithms chapter in the Python Cookbook, published by O'Reilly. 该模块避免了许多用于测量执行时间的常见陷阱。 另请参阅O'Reilly出版的Python Cookbook中Tim Peters对算法一章的介绍。 Library usage: see the Timer class. Command line usage: python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-p] [-h] [--] [statement] Options: -n/--number N: how many times to execute 'statement' (default: see below) 多少次执行“语句”(默认值:请参见下文) -r/-