笔记

作者: 墨流引 | 来源:发表于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