笔记

作者: 墨流引 | 来源:发表于2019-11-29 20:46 被阅读0次

    读文件,关文件

    f = open('somefile.txt', 'rt')
    # 打开一个文件
    data = f.read()     # 读取文件
    f.close()           # 关闭文件
    
    # 使用with语句可以不用手动关闭文件
    
    # 使用带有 rt 模式的 open() 函数读取文本文件。如下所示:
    with open('somefile.txt', 'rt') as f:
        data = f.read()
    
    # Iterate over the lines of the file
    with open('somefile.txt', 'rt') as f:
        for line in f:
            pass
            # process line
            
    # 类似的,为了写入一个文本文件,使用带有 wt 模式的 open() 函数, 如果之前文件内容存在则清除并覆盖掉。如下所示:
    # Write chunks of text data
    with open('somefile.txt', 'wt') as f:
        f.write(text1)
        f.write(text2)
        ...
    
    # Redirected print statement
    with open('somefile.txt', 'wt') as f:
        print(line1, file=f)
        print(line2, file=f)
        ...
    
    # 如果是在已存在文件中添加内容,使用模式为 at 的 open() 函数。
    

    读写文件参考

    算法,快排

    
    def quick_sort(L):
        return q_sort(L, 0, len(L) - 1)
    
    def q_sort(L, left, right):
        if left < right:
            pivot = Partition(L, left, right)
    
            q_sort(L, left, pivot - 1)
            q_sort(L, pivot + 1, right)
        return L
    
    def Partition(L, left, right):
        pivotkey = L[left]
    
        while left < right:
            while left < right and L[right] >= pivotkey:
                right -= 1
            L[left] = L[right]
            while left < right and L[left] <= pivotkey:
                left += 1
            L[right] = L[left]
    
        L[left] = pivotkey
        return left
    
    L = [5, 9, 1, 11, 6, 7, 2, 4]
    
    print(quick_sort(L))
    

    快速排序参考

    排序参考

    冒泡

    def bubbleSort(arr):
        for i in range(1, len(arr)):
            for j in range(0, len(arr)-i):
                if arr[j] > arr[j+1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr
    
    冒泡排序

    装饰器

    一个装饰器就是一个函数,它接受一个函数作为参数并返回一个新的函数。 当你像下面这样写:

    @timethis
    def countdown(n):
        pass
    

    跟像下面这样写其实效果是一样的:

    def countdown(n):
        pass
    countdown = timethis(countdown)
    

    字符串匹配(kmp)

    阮一峰 - 字符串匹配的KMP算法

    kmp

    github-KMP-Algorithm-Swift

    单例模式

    单例

    二分查找

    def binarySearch (arr, l, r, x): 
        # 基本判断
        if r >= l: 
            mid = int(l + (r - l)/2)
            # 元素整好的中间位置
            if arr[mid] == x: 
                return mid 
              
            # 元素小于中间位置的元素,只需要再比较左边的元素
            elif arr[mid] > x: 
                return binarySearch(arr, l, mid-1, x) 
    
            # 元素大于中间位置的元素,只需要再比较右边的元素
            else: 
                return binarySearch(arr, mid+1, r, x) 
        else: 
            # 不存在
            return -1
      
    # 测试数组
    arr = [ 2, 3, 4, 10, 40 ] 
    x = 10
      
    # 函数调用
    result = binarySearch(arr, 0, len(arr)-1, x) 
      
    if result != -1: 
        print ("元素在数组中的索引为 %d" % result )
    else: 
        print ("元素不在数组中") 
    

    redis持久化的两种方式(关系型和非关系型的区别)

    Linux命令(查内存,服务器内存,查当前运行进程数,打开文件的五种方式)

    日志排错

    grep在文件文本里过滤错误

    怎么在代码里生成日志

    深浅拷贝,乐观锁,悲观锁

    乐观锁

    • 用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。
    • 何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。
      • 当读取数据时,将version字段的值一同读出。
      • 数据每更新一次,对此version值加1。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,不予更新。
    • 这个版本号可以是数字,也可以是时间(精度只能到毫秒),也可以是一个唯一的字符串标识hash
      • update tbl_name set filed=new_value where some_condition and version = versioin_value;
      • 判断影响行数,判断是否执行成功,如果失败了重新取数据。
    • 缺点:高并发场景下,CPU耗用高
    • 即便我们是单条SQL:
      • update tbl_name set value = 51 where id = {id};
      • update tbl_name set value = value + 1 where id = {id};

    悲观锁

    • 悲观锁就是在操作数据时,认为此操作必然会出现数据冲突,所以提前为冲突做准备。
    • 要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,我们可以使用命令设置MySQL为非autocommit模式:set autocommit = 0;
    • 行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。
    • 行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。
    • 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。
    • 前面提到过,在InnoDB引擎中既支持行级锁也支持表级锁,那么什么时候会锁住整张表,什么时候或只锁住一行呢? 只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表级锁!

    订单

    二叉树遍历,

    二叉树遍历

    python实现二叉树遍历

    python实现二叉树和它的七种遍历

    单双链表,

    什么是单双链表

    单向链表包含两个域,一个是信息域,一个是指针域。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。

    [图片上传失败...(image-8a1eae-1575031571114)]

    python实现单链表、双链表、循环链表

    爬楼梯(动态规划)

    漫画:什么是动态规划?

    十级楼梯,每次只走一步或者两步,有几种走法

    def dynamicProgram(n):
        if n < 1:
            return 0
        if n == 1:
            return 1
        if n == 2:
            return 2
        
        a=1
        b=2
        temp=0
        while i<=n:
            temp = a+b
            a,b = b,temp
        return temp
    
    dynamicProgram(10)
    

    线程协程进程

    线程和进程和协程

    进程是什么呢?

    直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。

    线程又是什么呢?

    线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。

    对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

    协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。

    协程的开销远远小于线程的开销。

    进程和线程、协程的区别

    1、进程多与线程比较

    线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
    1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
    2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
    3) 线程是处理器调度的基本单位,但进程不是
    4) 二者均可并发执行

    ​ 5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

    2、协程多与线程进行比较

    ​ 1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。

    ​ 2) 线程进程都是同步机制,而协程则是异步

    ​ 3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

    python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。

    RSA、DSA

    RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性是基于整数有限域离散对数难题。基本上可以认为相同密钥长度的 RSA 算法与 DSA 算法安全性相当。

    RSA、DSA

    高并发

    超买,各种支付方式

    计算机思维题

    前端,display漂浮,

    程序员小灰合集 https://www.cnblogs.com/shi-zhe/p/11728374.html

    相关文章

      网友评论

          本文标题:笔记

          本文链接:https://www.haomeiwen.com/subject/jhfnwctx.html