xml地图|网站地图|网站标签 [设为首页] [加入收藏]
学习笔记之基础知识一,创建安全的栈
分类:编程

知识点1:

如何设置每个py 文件新建时输出自己的名字及日子
打开file->settings->file and code templete->python script ,输入如下2行,点击apply即可
# __author__= "Hellen" #如果要系统自动货物用户名,输入#__author__=${USER}
#date: ${DATE}

知识点2:
相关快捷键收集
向下复制一行快捷键  ctrl+d
运行脚本右键选项run +文件名即可,快捷键 ctrl+shift+F10
ctrl +? 一次注释多行 取消多行注释在按一次 ctrl+?

知识点3:
判断是否是数字使用函数 isdigit() 结果为true表示是数字
字符串格式化输入出:
使用占位符
%s 代表字符串类型
%d 代表整数型
%f 代表浮点型(float),等于小数
eg:
name = "test"
city="xi'an"
print("her name is %s, her city is %s"%(name,city))

知识点4:
数据类型:
int         整数 python 3.x 不区分整数和长整数
float       浮点型
5+3J        虚数
True|False  布尔值 只有2个值(True 是真,False 是假)
"abc"          字符串
("a","d")      元组
[2,5,"test"]    列表
{"name":"hellen","age":"22"} 字典

1) 列表 
a=["3","zhangsan","huawei","test"]
切片获取子列表的值
a[1:3] # 切片取值,表示索引为1和2的对应值,相当于[1,3) 后面的3不包含 ["zhangsan","huawei"]
a[1:]  #表示从索引1取到最后["zhangsan","huawei","test"]
a[1:-1] #取到倒数第二个值,[1,-1]-1代表最后一位,但是不包含,相当于取到倒数第二位
a[1:-1:2] #从左到右隔一个取一个,2代表步长, 步长可以为-2 -相当于方向 步长为负表示从右向左取
a[2::-2] # 从右向左步长为2取值 ["huawei","3"]
添加列表的值:
a.append("jinxin") # 给列表添加值,默认加在最后 ["3","zhangsan","huawei","test",jinxin""]
a.insert(1,"lisi") #在指定位置添加值,1是索引值,表示要插入的位置,索引从0开始 ["3","lisi","zhangsan","huawei","test",jinxin""]
extend : 将b的值加入到a中,改变a的值,b取值不变
a=[1,2,3]  a的结果[1,2,3,4,5,6]
b=[4,5,6]  b的结果[4,5,6]
a.extend(b)
删除列表的值:
a.pop(0) 0 是索引值,表示删除索引为0的即第一个值即删除"3" 
a.pop() 如果pop后面不加索引,默认删除最后一个值
a.remove("huawei") 删除值为huawei的值,如果列表找那个有重复的值,只会删除满足的第一个
del a[1]  删除a[1]对应的值
del a  删除整个对象
修改列表的值
a[1]="change" #将列表中zhangsan的值修改为change ,["3","change","huawei","test"]
a[1:3]=["A","B"] 同时修改列表中2个值 ["3","A","B","test"]
计算某个元素出现次数 count:
s=[2,3,5,2,6]
s.count(2) 计算2出现的次数
查找元素所对应的索引 index
sstr=["A","b',"D"]
print(sstr.index("D")) 查找对应值所在的索引,结果我2
倒叙 reverse
sstr=["A","b',"D"]
sstr.reverse()
排序 sort
s=["A","b',"D","d"]
s.sorted() #默认是升序 按ASCII码拍序 ["A","D","b","d"]
s.sort(reverse=True) #reverse=True 默认降序排列
判断是否在列表内 in 或者not in
s=["A","b',"D","d"]
"A" in s 返回结果是:True
"D" not in s 返回结果是:False
type(a) is list 判断a是否是列表
深浅拷贝
copy.copy 浅拷贝,其实拷贝的是引用,修改一个的值,另外一个也随之改变
copy.deepcopy 深拷贝,修改其中一个另外一个不受影响

知识点5:
常用循环:
1) for 循环
range(3) #range 里面只能放整数 相当于小于3的整数
range(1,3) 相当于[1,3)
range(1,101,2) 打印为[1-100] 之间的奇数, 1代表开始值,100代表结束值,2代表步长值 
for i in "python":   # 元素遍历
    print(i)

# 登录测试 写法
# for..else 只有当for循环正常执行完毕,中间没被打断就会执行else,for在的话for 循环找那个有break,则else不会执行
user="alex"
pwd="123"
for i in range(3):
    username = input("username:")
    password = input("password:")
    if username == user and password == pwd :
        print("welcom %s login ..."% username)
        break
    else:
        print("invalid username or password.")
else: # 如果auth为false 打印下面内容,相当于 if auth == False
    print("auth fail 3 times")

2)while循环 
user="alex"
pwd="123"
count = 0
while count < 3:
    username = input("username:")
    password = input("password:")
    if username == user and password == pwd :
        print("welcom %s login ..."% username)
        break
    else:
        print("invalid username or password.")
    count +=1
3) continue 跳出当次循环,继续下一次循环
# 打印小于5的数,结果是0,1,2,3,4,5
for i in range(10):
    if i > 5:
        continue
    print(i)
4)break 结束跳出当前循环体
for i in range(10):
    if i < 5:
        continue
    print(i)
    for j in range(10):
        print("second j is:%d"%j)
        if j == 5:
            break
    break

    在C#中,用于存储的结构较多,如:DataTable,DataSet,List,Dictionary,Stack等结构,各种结构采用的存储的方式存在差异,效率也必然各有优缺点。现在介绍一种后进先出的数据结构。

Django的View(视图)

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

   谈到存储结构,我们在项目中使用的较多。对于Task存储结构,栈与队列是类似的结构,在使用的时候采用不同的方法。C#中栈(Stack)是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

一个简单的视图

下面是一个以HTML文档的形式返回当前日期和时间的视图:

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

让我们来逐行解释下上面的代码:

  • 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。

  • 接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request

    注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够比较准确地反映出它实现的功能。

  • 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

Django使用请求和响应对象来通过系统传递状态。

当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。

每个视图负责返回一个HttpResponse对象。

    在C#中,栈通常保存着我们代码执行的步骤。C#中的引用类型存储在栈中,在程序运行的时候,每个线程(Thread)都会维护一个自己的专属线程堆栈。当一个方法被调用的时候,主线程开始在所属程序集的元数据中,查找被调用方法,然后通过JIT即时编译并把结果(一般是本地CPU指令)放在栈顶。CPU通过总线从栈顶取指令,驱动程序以执行下去。

FBV和CBV

基于函数的view,就叫FBV。基于类的view,就叫CBV。

添加班级示例:

    以上对栈这个数据结构进行了一个简单的介绍,现在看一下C#实现栈结构的底层方法:

FBV版:

# FBV版添加班级
def add_class(request):
    if request.method == "POST":
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
    return render(request, "add_class.html")

 

   /// <summary>
    /// 初始化 <see cref="T:System.Collections.Generic.Stack`1"/> 类的新实例,该实例为空并且具有默认初始容量。
    /// </summary>
    [__DynamicallyInvokable]
    public Stack();
    /// <summary>
    /// 初始化 <see cref="T:System.Collections.Generic.Stack`1"/> 类的新实例,该实例为空,具有指定的初始容量或默认的初始容量(其中较大的一个)。
    /// </summary>
    /// <param name="capacity"><see cref="T:System.Collections.Generic.Stack`1"/> 可包含的初始元素数。</param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="capacity"/> is less than zero.</exception>
    [__DynamicallyInvokable]
    public Stack(int capacity);
    /// <summary>
    /// 初始化 <see cref="T:System.Collections.Generic.Stack`1"/> 类的新实例,该实例包含从指定集合复制的元素并且具有足够的容量来容纳所复制的元素。
    /// </summary>
    /// <param name="collection">从中复制元素的集合。</param><exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is null.</exception>
    [__DynamicallyInvokable]
    public Stack(IEnumerable<T> collection);

CBV版:

# CBV版添加班级
from django.views import View


class AddClass(View):

    def get(self, request):
        return render(request, "add_class.html")

    def post(self, request):
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")

注意:

使用CBV时,urls.py中也做对应的修改:

# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),

   以上是对stack的部分方法的介绍,由于在操作数据存储的同时,会考虑到线程的安全性。

给视图加装饰器

   进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。线程分为前台线程和后台线程,通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。

使用装饰器装饰FBV

FBV本身就是一个函数,所以和给普通的函数加装饰器无差:

def wrapper(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        ret = func(*args, **kwargs)
        end_time = time.time()
        print("used:", end_time-start_time)
        return ret
    return inner


# FBV版添加班级
@wrapper
def add_class(request):
    if request.method == "POST":
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
    return render(request, "add_class.html")

本文由澳门新葡亰手机版发布于编程,转载请注明出处:学习笔记之基础知识一,创建安全的栈

上一篇:基础练习,cakephp引入其他控制器封装方法 下一篇:没有了
猜你喜欢
热门排行
精彩图文