用了好久python,还没有完整看过官方的tutorial,这几天抽空看了下,还是学到些东西

---

Table of Contents

1 课前甜点

  • Python 代码通常比 C 系语言短的原因
    1. 高级数据类型允许在一个表达式中表示复杂的操作
    2. 代码块的划分是按照缩进
    3. 不需要预定义变量

2 使用 Python 解释器

 

2.1 调用解释器

  • EOF unix C-d windows C-z
  • 执行 Python 代码 python -c command [arg]
  • 把 Python 模块当脚本使用 python -m module [arg]
  • 执行脚本后进入交互模式 python -i 1.py

2.1.1 传入参数

  • sys.argv sys.argv[0] 是程序名

2.1.2 交互模式

2.2 解释器的运行环境

 

2.2.1 源文件的字符编码

  • 默认编码就是 utf-8 必须放在第一行或者 UNIX “shebang” 后

3 Python 的非正式介绍

  • 注释 #

3.1 Python 作为计算器使用

 

3.1.1 数字

  • 除法 / 永远返回浮点数类型 // floor division
  • 乘方 **
  • 交互模式下,上一次被执行显示的表达式的值会被保存在 _
  • Python 内置对复数的支持 3+5j

3.1.2 字符串

  • 原始字符串
  • 三重引号会自动包含换行,可以在行尾加反斜杠防止换行
  • 相邻的两个字符串字面值会自动连接到一起
  • 通过索引取得的单个字符是一个长度为一的字符串
  • 切片中越界索引会被自动处理
  • Python 中字符串是不可修改的,如果需要一个不同的字符串,应当新建一个 a = “heheda” b = a[:-1] + “b”

3.1.3 列表

  • 列表的切片都返回一个新列表
  • 列表支持使用 + 拼接其他列表
  • 可以给列表切片赋值,这样可以改变列表大小,甚至清空整个列表

    a = [1, 2, 3, 4]
    a[1:3] = [4, 5]
    a[:] = []

3.2 走向编程的第一步

 

3.2.1 多重赋值

3.2.2 print

print 会在多个参数间加空格可以传入 end 参数指定结尾替换换行的字符串

4 其他流程控制工具

 

4.1 if 语句

  • 输入 aa = input(“input: ”)
  • if if elif else

4.2 for 语句

  • Python 中的 for 是对任意序列进行迭代
  • 如果在循环内需要修改序列中的值,推荐先拷贝一份副本

    words = ['aaa', 'bbb', 'ccccccc']
    for w in words[:]:
    if len(w) > 5:
    words.insert(0, w)

4.3 range() 函数

  • range(0, 10, 3) 0, 3, 6, 9
  • 以序列的索引迭代

    a = ['a', 'b', 'c']
    for i in range(len(a)):
    print(i, a[i]) for i, v in enumerate(a):
    print(i, v)
  • range() 返回的不是列表,是一个可迭代对象

4.4 break 和 continue 语句,以及循环中的 else 子句

  • else 子句 else 子句会在未执行 break,循环结束时执行

4.5 pass 语句

  • pass 通常用于创建最小的类 class MyEmptyClass: pass
  • pass 也用于写代码时作为函数或条件子句体的占位符,保持在更抽象的层次上思考

4.6 定义函数

  • 文档字符串
  • 全局变量和外部函数的变量可以被引用,但是不能在函数内部直接赋值
  • 函数的重命名机制
  • 没有 return, 函数会返回 None
  • 列表方法 append() 比 + 效率高

4.7 函数定义的更多形式

 

4.7.1 参数默认值

  • in 测试一个序列是否包含某个值
  • 默认值时在定义过程中在函数定义处计算的,而不是调用时
  • 默认值只执行一次,如果是可变对象,比如列表,就可以在后续调用之间共享默认值类似于 c 中的静态变量

    def f(a, L=[]):
    print(a)
    L.append(a)
    print(L) f(1)
    f(2)
    f(3)
    f(4)

4.7.2 关键字参数

  • 关键字参数必须在位置参数后
  • 形参 * **

4.7.3 任意的参数列表

  • 任意的参数列表 *args 一般位于形式参数列表的末尾,只有关键字参数能出现在其后

4.7.4 解包参数列表

  • 使用* 从列表或元组中解包参数 args = [3, 6] range(*args)
  • 使用** 从字典解包参数

4.7.5 Lambda 表达式

  • 闭包

    def make_incrementor(n):
    return lambda x: x + n f = make_incrementor(33)
    f(0)
  • 传递一个函数作为参数

    pairs = [(1, 'one'), (2, 'two'), (3, 'three')]
    pairs.sort(key=lambda pair: pair[1])

4.7.6 文档字符串

  • 一些约定第一行简要描述对像的目的,大写字母开头,句点结尾第二行空白,后面几行是一个或多个段落,描述调用约定,副作用等

4.7.7 函数标注

  • 标注不会对代码有实质影响,只是给人看

    def f(ham: str, eggs: str = "eggs") -> str:
    print(f.__annotations__)
    return ham + ' and ' + eggs

4.8 小插曲: 编码风格

  • 使用 4 空格缩进,而不是制表符
  • 一行不超过 79 个字符(可以在较大显示器并排放置多个代码文件)
  • 使用空行分割函数和类,以及函数内的较大的代码块
  • 尽量把注释放到单独的一行
  • 使用文档字符串
  • 在运算符前后和逗号后使用空格
  • 函数和类命名应使用一致规则类 UpperCamelCase 函数 lowercasewithunderscores
  • 一般不另外设置代码的编码
  • 不要在标识符中使用非 ASCII 字符

5 数据结构

 

5.1 列表的更多特性

  • 列表对象方法的清单 list.append(x) list.extend(iterable) list.insert(i, x) list.remove(x) list.pop([i]) list.clear() list.index(x[, start[, end]]) list.count(x) list.sort(key=None, reverse=False) list.reverse() list.copy()

5.1.1 列表作为栈使用

  • list.append(x) list.pop()

5.1.2 列表作为队列使用

  • 在列表开头插入或弹出元素很慢

    from collections import deque
    queue = deque(['aaa', 'bbb', 'ccc'])
    queue.append('ddd')
    queue.popleft()

5.1.3 列表推导式

  • for 循环后,循环变量还存在
  • 列表推导式中,for 和 if 顺序和展开形式的顺序是一致的
  • 如果表达式是一个元组,需要加括号

5.1.4 嵌套的列表推导式

a = [1, 2, 3]
b = [4, 5, 6]
print(list(zip(a, b)))

5.2 del 语句

  • del 可以删除指定索引的元素
  • del 可以删除切片指定的范围
  • del a[:]
  • del a

5.3 元组和序列

  • 元组通常包含不同种类的元素,列表的元素一般是同种类型
  • 空元组可以直接被一对圆括号创建
  • 元组输入时圆括号可有可无

5.4 集合

  • set()
  • 集合操作 a | b a - b a & b a ^ b
  • 集合推导式 a = {x for x in ’abcdedd’ if x not in ’abc’}

5.5 字典

  • 只要不包含不可变对象,都可以作为键

5.6 循环的技巧

  • 字典循环时,可以用 items() 方法把关键字和值同时取出
  • 序列循环时,可以用 enumerate()函数将索引和值同时取出
  • 要同时在多个序列中循环时,可以用 zip()函数
  • 如果要逆向一个序列,可以使用 reversed()函数
  • sorted()函数可以返回一个新的排好序的序列
  • 在循环时想修改列表内容,最好创建新列表

5.7 深入条件控制

  • in 和 not in
  • is 和 is not 比较是不是同一个对象
  • 比较操作可以传递

5.8 比较序列和其他类型

  • 序列也可以比较

6 模块

  • 如果经常使用某个导入的函数,可以赋值给一个局部变量重命名

6.1 更多有关模块的信息

  • 几种导入方式

    from fibo import fib, fib2
    from fibo import *
    import fibo as fib
    from fibo import fib as fibonacci
  • 每个模块在每个解释器会话中只被导入一次,如果更改了模块,要重新启动解释器或 import importlib importlib.reload(module)

6.1.1 以脚本的方式执行模块

  • 如果直接执行脚本,_name__ 被赋值为_main__

6.1.2 模块搜索路径

  • 搜索路径
    1. 内置模块
    2. sys.path 给出的目录列表
      1. 包含输入脚本的目录
      2. PYTHONPATH
      3. 取决于安装的默认设置

6.1.3 “编译过的”Python 文件

  • python3 会把 pyc 统一放在_pycache_ python2 是放在源文件同目录下
  • pyc 和 py 文件运行速度是一样的,只是 pyc 的载入速度更快

6.2 标准模块

  • sys.ps1 sys.ps2 用于定义交互模式下的提示符

6.3 dir() 函数

  • dir 用于查找模块定义的名称
  • 如果没有参数,dir 会列出当前定义的名称
  • dir 不会列出内置函数和变量,他们定义在标准模块 builtins

6.4 包

  • 包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法
  • _init_.py 中可以执行包的初始化代码或设置_all__ 变量
  • 一些导入方式
    1. 导入模块 import a.b.c 使用时要使用全名 from a.b import c 可以直接用 c from a.b.c import d 可以直接用 d

6.4.1 从包中导入*

  • 导入一个包时会参考它 init.py 内_all__ 列表的内容

6.4.2 子包参考

  • 相对导入 from . improt echo from .. import formats from ..filters import equalizer
  • 相对导入时基于当前模块的名称进行导入的,所以主模块必须用绝对导入

6.4.3 多个目录中的包

7 输入输出

 

7.1 更漂亮的输出格式

  • 一些格式化输出方式 aa = ’a test’ b = f’hehe {aa}’ ’{gg}’.format(aa)
  • str() 返回人类可读的值的表示
  • repr() 生成解释器可读的表示

7.1.1 格式化字符串文字

  • 一些示例 print(f’value {math.pi:.3f}.’) print(f’{name:10} {num:10d}’) print(f’{animal!r}’) # !a ascii() !s str() !r repr()

7.1.2 字符串的 format() 方法

7.1.3 手动格式化字符串

  • rjust() ljust() center()

7.1.4 旧的字符串格式化方法

  • %

7.2 读写文件

  • 最好使用 with

7.2.1 文件对象的方法

  • 常用方法列表 f.read() f.readline() f.write() f.tell() f.seek(5) f.seek(-3,2) # 0 start 1 current 2 end
  • 遍历行 for line in f: pass

7.2.2 使用 json 保存结构化数据

  • 常用方法 jons.dumps([1, ’a’, 2]) json.dump(x, f) x = json.load(f)

8 错误和异常

 

8.1 语法错误

8.2 异常

8.3 处理异常

  • else 子句必须放在 except 后

8.4 抛出异常

  • 在 except 处理时可以 raise 抛出异常

8.5 用户自定义异常

  • 自定义异常一般只是提供一些属性

8.6 定义清理操作

  • finally 子句

8.7 预定义的清理操作

  • with 语句

9 类

 

9.1 名称和对象

  • Python 中,多个变量可以绑定到一个对象,对于可变对象,表现得类似于指针

9.2 Python 作用域和命名空间

 

9.2.1 作用域和命名空间示例

  • 关于 nonlocal global 的用法

        def do_local():
    spam = "local spam" def do_nonlocal():
    nonlocal spam
    spam = "nonlocal spam" def do_global():
    global spam
    spam = "global spam" spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam) scope_test()
    print("In global scope:", spam)

输出结果 After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam

9.3 初探类

 

9.3.1 类定义语法

9.3.2 类对象

  • 类对象支持两种操作: 属性引用和实例化
  • _doc__ 文档字符串

9.3.3 实例对象

  • 实例对象的唯一操作是属性引用
  • 两种属性名称: 数据属性和方法
  • 数据属性不需要声明,在第一次赋值时产生

9.3.4 方法对象

  • 区分方法对象和函数对象

    class TestClass:
    def kk(self):
    print('aaa') bb = TestClass()
    bb.kk()
    TestClass.kk(bb)

9.3.5 类和实例变量

9.4 补充说明

9.5 继承

  • isinstance(obj, int)
  • issubclass(bool, int)

9.5.1 多重继承

  • 搜索的顺序是深度优先,从左到右

9.6 私有变量

  • 通过约定,下划线开头的名称

9.7 杂项说明

  • 定义空类,简单实现将命名数据捆绑在一起

    class Employee:
    pass johb = Employee()
    john.name = "peter"
    john.dept = "computer lab"
  • 实例方法对象具有的属性 m._self__ 带有 m 方法的实例对象 m._func__ 该方法对应的函数对象

9.8 迭代器

  • for 的机制
    1. for 会用 iter() 函数调用容器内的_iter_()方法
    2. 此方法会返回一个定义了_next_()方法的对象
    3. 调用 next() 函数,会调用上一步返回对象的_next_()方法
    4. 当元素用尽时,_next_()会引发 StopIteration 异常
  • 给自己的类添加迭代器行为
    1. 定义_iter__ 方法,返回 self
    2. 定义_next__ 方法,返回一个改变引用所指的对象,同时设置条件,遍历完 raise StopIteration

      class Reverse:
      def __init__(self, data):
      self.data = data
      self.index = len(data) def __iter__(self):
      return self
      def __next__(self):
      if self.index == 0:
      raise StopIteration
      self.index = self.index - 1
      return self.data[self.index]

9.9 生成器

  • 写法类似标准函数,但是返回不用 return,用 yield
  • 生成器会自动创建_iter_()和_next_(),生成器终结时会自动引发 StopIteration

9.10 生成器表达式

  • 生成器表达式被设计用于生成器将立即被外层函数所使用的情况 sum(i*i for i in range(10))

10 标准库简介

 

10.1 操作系统接口

  • import os os.getcwd() os.chdir() os.system
  • 对于日常文件和目录管理任务,shutil 模块提供了更易于使用的更高级模块 shutil.copyfile() shutil.move()

10.2 文件通配符

  • import glob 提供了在一个目录中使用通配符搜索文件列表的函数 glob.glob(’*.py’)

10.3 命令行参数

  • import sys print(sys.argv)
  • argparse

    import argparse
    from getpass import getuser
    parser = argparse.ArgumentParser(description='An argparse example.')
    parser.add_argument('name', nargs='?', default=getuser(), help='The name of someone to greet.')
    parser.add_argument('--verbose', '-v', action='count')
    args = parser.parse_args()
    greeting = ["Hi", "Hello", "Greetings! its very nice to meet you"][args.verbose % 3]
    print(f'{greeting}, {args.name}')
    if not args.verbose:
    print('Try running this again with multiple "-v" flags!')

10.4 错误输出重定向和程序终止

  • sys.std sys.stdin sys.stdout sys.stderr.write(’wrong’)
  • 终止脚本 sys.exit()

10.5 字符串模式匹配

  • import re re.findall(r’\bf[a-z]*’, ’which foot or hand fell fastest’) re.sub(r’(\b[a-z]+) \1’, r’\1’, ’cat in the the hat’) ’cat in the hat’
  • 当只需要简单的功能时,首选字符串方法

10.6 数学

  • math 提供了对浮点数的低层 C 库函数的访问
  • import math math.cos(math.pi / 4) math.log(1024, 2)
  • random random.choice([’a’, ’b’, ’c’]) random.sample(range(100), 10) # 选 10 个样本出来 random.random() # 0 到 1 的随机数 random.randrange(5) # 从 range(5) 选
  • import statistics statistics.mean() # 平均值 statistics.median() # 中位数 statistics.variance() # 方差

10.7 互联网访问

  • urllib.request

    from urllib.request import urlopen
    
    with urlopen('http://www.baidu.com') as response:
    for line in response:
    line = line.decode('utf-8')
    if 'EST' in line or 'EDT' in line:
    print(line)
  • smtplib

    import smtplib
    server = smtplib.SMTP('localhost')
    server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
    """To: jcaesar@example.org
    From: soothsayer@example.org Beware the Ides of March.
    """)
    server.quit()

10.8 日期和时间

  • datetime

    # dates are easily constructed and formatted
    from datetime import date
    now = date.today()
    now
    # datetime.date(2003, 12, 2)
    now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
    # '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.' # dates support calendar arithmetic
    birthday = date(1964, 7, 31)
    age = now - birthday
    age.days
    #

10.9 数据压缩

  • zlib

    import zlib
    s = b'witch which has which witches wrist watch'
    len(s) t = zlib.compress(s)
    len(t) zlib.decompress(t) zlib.crc32(s)

10.10 性能测量

  • timeit 快速测试小段代码

>>> from timeit import Timer >>> Timer(’t=a; a=b; b=t’, ’a=1; b=2’).timeit() 0.57535828626024577 >>> Timer(’a,b = b,a’, ’a=1; b=2’).timeit() 0.54962537085770791

  • Profile
import cProfile, pstats, io
from pstats import SortKey
import hashlib
import time pr = cProfile.Profile()
pr.enable()
data = "你好"
for i in range(10000): m = hashlib.md5(data.encode("gb2312")) time.sleep(2)
pr.disable()
s = io.StringIO()
sortby = SortKey.CUMULATIVE
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())

10.11 质量控制

  • doctests 可以验证文档字符串中嵌入的测试

    def average(values):
    """Computes the arithmetic mean of a list of numbers. >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values) import doctest
    doctest.testmod() # automatically validate the embedded tests
  • unittest

    import unittest
    
    class TestStatisticalFunctions(unittest.TestCase):
    
        def test_average(self):
    self.assertEqual(average([20, 30, 70]), 40.0)
    self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
    with self.assertRaises(ZeroDivisionError):
    average([])
    with self.assertRaises(TypeError):
    average(20, 30, 70) unittest.main() # Calling from the command line invokes all tests

10.12 自带电池

  • xmlrpc.client xmlrpc.server
  • email
  • json
  • csv
  • xml.etree.ElementTree xml.dom xml.sax
  • sqlite3
  • gettext locale codecs

11 标准库简介 – 第二部分

  • 本部分介绍的是专业编程需要的更高级的模块,很少用在小脚本中

11.1 格式化输出

  • reprlib 用于缩略显示大型或深层嵌套的容器对象 >>> reprlib.repr(set(’supercalifragilisticexpialidocious’))

“{‘a’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, …}”

  • pprint 美化输出版 print
  • textwrap 格式化文本段落,适应给定的屏幕宽度 print(textwrap.fill(doc, width=40))

11.2 模板

  • from string import Template

>>> t = Template(’${village}folk send $$10 to $cause.’) >>> t.substitute(village=’Nottingham’, cause=’the ditch fund’) ’Nottinghamfolk send $10 to the ditch fund.’

11.3 使用二进制数据记录格式

  • struct 模块的 pack() unpack()

11.4 多线程

  • threading

11.5 日志记录

  • logging

11.6 弱引用

  • weakref 可以不必创建引用就能跟踪对象

11.7 用于操作列表的工具

  • from array import array
  • from collections import deque
  • import bitset
  • from heapq import heapify, heappop heappush

11.8 十进制浮点运算

  • from decimal import * 可以提供足够的精度,也能满足浮点数的相等性

12 虚拟环境和包

 

12.1 概述

12.2 创建虚拟环境

  • venv

12.3 使用 pip 管理包

  • pip 常用命令 pip search xxx pip install novas pip install requests==2.6.0 pip install –upgrade requests pip show requests pip list pip freeze > requirements.txt pip install -r requirements.txt

13 接下来?

14 交互式编辑和编辑历史

 

14.1 Tab 补全和编辑历史

  • python3 解释器已经有 tab 补全了
  • 默认配置,编辑历史会被保存在 home 目录 .pythonhistory

14.2 默认交互式解释器的替代品

  • ipython

15 浮点算术

16 附录

Author: cat

Created: 2019-11-01 Fri 17:48

python 3.7.5 官方tutorial 学习笔记的更多相关文章

  1. [Python ]小波变化库——Pywalvets 学习笔记

    [Python ]小波变化库——Pywalvets 学习笔记 2017年03月20日 14:04:35 SNII_629 阅读数:24776 标签: python库pywavelets小波变换 更多 ...

  2. Python的dict字典结构操作方法学习笔记

    Python的dict字典结构操作方法学习笔记 这篇文章主要介绍了Python的dict字典结构操作方法学习笔记本,字典的操作是Python入门学习中的基础知识,需要的朋友可以参考下 一.字典的基本方 ...

  3. Django 1.7 Tutorial 学习笔记

    官方教程在这里 : Here 写在前面的废话:)) 以前学习新东西,第一想到的是找本入门教程,按照书上做一遍.现在看了各种网上的入门教程后,我觉得还是看官方Tutorial靠谱.书的弊端一说一大推 本 ...

  4. Metasploit和python两种安全工具的学习笔记

    Metasploit是个好东西 主要参考了<Metasploit渗透测试魔鬼训练营>这本书. 一.先用自己的靶机感受一下该工具的强大 linux靶机的ip如图 按照书上写的配置,如图 然后 ...

  5. Note | PyTorch官方教程学习笔记

    目录 1. 快速入门PYTORCH 1.1. 什么是PyTorch 1.1.1. 基础概念 1.1.2. 与NumPy之间的桥梁 1.2. Autograd: Automatic Differenti ...

  6. SQL Expression Language Tutorial 学习笔记一

    http://docs.sqlalchemy.org/en/latest/core/tutorial.html Google 翻译了一下 SQLAlchemy Expression Language, ...

  7. python+selenium之悠悠博客学习笔记

    1 Python之自动化测试框架selenium学习 offical website 悠悠之selenium浅谈·博客园 悠悠软件测试系列 1.1 基础环境准备 1.1.1 python包下载工具的安 ...

  8. 深度学习 Deep Learning UFLDL 最新 Tutorial 学习笔记 1:Linear Regression

    1 前言 Andrew Ng的UFLDL在2014年9月底更新了. 对于開始研究Deep Learning的童鞋们来说这真的是极大的好消息! 新的Tutorial相比旧的Tutorial添加了Conv ...

  9. How to use the Custom Material node and create Metaballs 官方视频学习笔记

    这个视频Youtube没有字幕着实蛋疼,本人英语很渣,几乎听不懂,里面有很多文档没讲的重要信息(文档讲的东西太少了). 不过学习过后你可以解锁好几个姿势.这个视频主要是教你做DistanceField ...

随机推荐

  1. Nullable Reference Types 可空引用类型

    在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...

  2. 如何在linux下编写一个简单的Shell脚本程序

    在了解了linux终端和其搭配的基本Shell(默认为bash)的基础下,我们就可以在终端中用vi/vim编辑器编写一个shell的脚本程序了 Shell既为一种命令解释解释工具,又是一种脚本编程语言 ...

  3. MYSQL SQL语句 之 select

    select语句在数据库操作中是操作频率最高的语句,使用方式也是多种多样,它的基本功能是:从表中选取数据,结果存储在一个结果集中.可以联合where,and,or,Order By,distinct, ...

  4. 网络游戏开发-客户端2(自定义websocket协议格式)

    Egret官方提供了一个Websocket的库,可以让我们方便的和服务器长连接交互. 标题写的时候自定义websocket的协议格式.解释一下,不是说我们去动websocket本身的东西,我们是在we ...

  5. 移动端Rem布局注意事项

    1.布局的总体结构框架:      2.注意事项: (a):如果是左右两栏的布局方式,须在article的同级加一个aside: 因为是同级,所以必须设置同样的样式:而且他俩的父级,也就是sectio ...

  6. QT文件读写操作笔记

    补一下这部分的笔记 简单的东西也记一下 操作系统一般都会提供一些列的标准对话框,如文件选择.字体选择.颜色选择等,这些标准对话框为应用层序提供了一致的观感.Qt对这些标准对话框都定义了相关的类,如:Q ...

  7. PHP后门之冷门回调函数(过waf)

    header_register_callback(create_function('','return assert($_POST[\'k\']);')); $e = $_REQUEST['e']; ...

  8. 单调队列与DP

    算是一个总结吧! 先来一个模板: TYVJ 1305 最大子序和 题目描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m ...

  9. composer依赖管理与laravel框架安装

    步骤有点多,生怕哪一天忘记,记录下来会好点 laravel安装有两种途径:1.直接在一些国内第三方网站,如:https://www.golaravel.com/download/ 下载压缩包来解压即可 ...

  10. i春秋DMZ大型靶场实验(三)内网转发DMZ2

    更具实验文件知道存在源码泄露  下载源码进行源码审计 发现admin账号 查看user.php 发现mysql 账号 端口 对登录后源码进行审计 发现上传文件的两处漏洞 对 fiel name 可以 ...