清朝云资源网

博客

  • 图解python | 简介

    Python简介

    Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

    Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构(请参考后续教程python基础语法)。

    Python 是一种解释型语言:这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。Python 是交互式语言:这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。Python 是面向对象语言:这意味着Python支持面向对象的风格或代码封装在对象的编程技术。Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。

    Python发展历史

    Python是由Guido van Rossum(Python之父,阿姆斯特丹大学数学和计算机硕士)在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。

    Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。

    Python1.0版本于1994年1月发布,这个版本的主要新功能是lambda, map, filter和reduce。2000年10月份,Python2.0发布了。这个版本的主要新功能是内存管理和循环检测垃圾收集器以及对Unicode的支持。然而,尤为重要的变化是开发的流程的改变,Python此时有了一个更透明的社区。2008年的12月份,Python3.0发布了。Python3.x不向后兼容Python2.x。

    Python2.7 是最后一个 Python2.x 版本,它除了支持Python 2.x语法外,还支持部分Python 3.1语法。

    Python特点

    1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。2.易于阅读:Python代码定义的更清晰。3.易于维护:Python的成功在于它的源代码是相当容易维护的。4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。8.数据库:Python提供所有主要的商业数据库的接口。9.GUI编程:Python支持GUI可以创建和移植到许多系统调用。10.可嵌入:你可以将Python嵌入到C/C++程序,让你的程序的用户获得”脚本化”的能力。

    Python应用场景

    常规软件开发

    Python支持函数式编程和OOP面向对象编程,能够承担任何种类软件的开发工作,因此常规的软件开发、脚本编写、网络编程等都属于标配能力。

    科学计算

    随着NumPy,SciPy,Matplotlib,Enthoughtlibrarys等众多程序库的开发,Python越来越适合于做科学计算、绘制高质量的2D和3D图像。

    和科学计算领域最流行的商业软件Matlab相比,Python是一门通用的程序设计语言,比Matlab所采用的脚本语言的应用范围更广泛,有更多的程序库的支持。虽然Matlab中的许多高级功能和toolbox目前还是无法替代的,不过在日常的科研开发之中仍然有很多的工作是可以用Python代劳的。

    自动化运维

    这几乎是Python应用的自留地,作为运维工程师首选的编程语言,Python在自动化运维方面已经深入人心,比如Saltstack和Ansible都是大名鼎鼎的自动化平台。

    云计算

    开源云计算解决方案OpenStack就是基于Python开发的,搞云计算的同学都懂的。

    WEB开发

    基于Python的Web开发框架不要太多,比如耳熟能详的Django,还有Tornado,Flask。其中的Python+Django架构,应用范围非常广,开发速度非常快,学习门槛也很低,能够帮助你快速的搭建起可用的WEB服务。

    网络爬虫

    也称网络蜘蛛,是大数据行业获取数据的核心工具。没有网络爬虫自动地、不分昼夜地、高智能地在互联网上爬取免费的数据,那些大数据相关的公司恐怕要少四分之三。能够编写网络爬虫的编程语言有不少,但Python绝对是其中的主流之一,其Scripy爬虫框架应用非常广泛。

    数据分析

    在大量数据的基础上,结合科学计算、机器学习等技术,对数据进行清洗、去重、规格化和针对性的分析是大数据行业的基石。Python是数据分析的主流语言之一。

    人工智能

    Python在人工智能大范畴领域内的机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用。

  • python入门之python 简介

    一、python了解

    python 是脚本语言。python 是一种面向对象的解释型计算机程序设计语言。语法简洁清晰,特色之一是强制用空白符作为语句缩进。

    优点:

    跨平台、胶水语言、开源免费、丰富的库 。

    缺点:

    运行速度慢、代码不能加密、场景、数据分析、网络应用、写简单的爬虫。

    1、IDLE

    IDLE 是 python shell , shell 意思是“外壳”,就是一个通过键入文本与程序交互的途径,就像 windows 那个 cmd 窗口,他们都是 shell,利用它们,可以给操作系统下达命令。利用 IDLE 这个shell 与 python 进行互动。

    2、print() 作用是什么?

    print() 会在输出窗口中显示一些文本。

    3、BIF

    BIF 就是 Built-in Functions, 内置函数。为了方便程序员快速编写脚本程序,python 提供了丰富的内置函数,可直接调用。

    例如 print() 的功能就是“打印到屏幕”,input() 的作用是接收用户输入。python3 提供了 68 个 BIF。

    在 python 或者 IDLE 中输入 dir (__builtns__) 可以看到 python 提供的内置方法列表 (注意,builtins 前后是两个下划线哦)。

    二、python 常用语法

    1、python 中的称号是 *(星号)。

    2、在一个字符串中嵌入一个双引号:用反斜杠(\)对双引号转义 :\”,或者用单引号引起字符串。

    3、在 python 中不能把两个完全不同的东西加在一起,比如数字和文本。

    4、在语句中加入 \n 可以进行换行。

    原始字符串结尾不可以加 \,只需在前面加 r 。

    5、print 语句使用 print() 函数。

    6、比较操作符:

    一行过长的语句可以使用反斜杠或者括号分解成几行。

    语句之间使用分号隔开即可。

    7、循环语句:

    8、条件分支:

    9、引入外援:

    10、拼接

    在一些编程语言,可以将两个字符串“相加”在一起,如:I +Love + You 会得到 I LoveYou , 在 python 里,这种做法叫做拼接字符串。

    11、你觉得‘love’和 Love 一样吗?

    不一样,love 和 Love 是完全不同的名字,所以编程的时候要小心。

    如果标识符已经赋值后才能在代码中使用(python 的变量是不用先声明的),未赋值的标识符直接使用会导致运行时错误。

    12、“=”和“= =”表示不同的含义。

    = 表示赋值,使用变量前要对其进行赋值,变量名不能以数字开头,变量名可以包括字母、数字、下划线。

    == 用来判断两个对象的值是否相等。

    python 不允许if条件中赋值,所以if c=1:会报错!

    注意:缩进是 python 的灵魂,缩进的严格要求使得 python 代码显得非常精简而且有层次。如果在正确的位置输入冒号“:”,IDLE会自动将下一行缩进。

    “缩进是四个空格哦”

  • Python (计算机程序设计语言)

    Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。

    Python简介及应用领域

    编辑

    Python是一种解释型脚本语言,可以应用于以下领域: [1]

    Web 和 Internet开发科学计算和统计人工智能教育桌面界面开发软件开发后端开发

    下载Python

    编辑

    在您开始之前,在你的计算机将需要Python,但您可能不需要下载它。首先检查(在同级目录下在命令行窗口输入python)有没有安装Python。如果你看到了一个Python解释器的响应,那么就能在它的显示窗口中得到一个版本号。通常的版本都可以做到Python的向前兼容。

    如果您需要安装, 您不妨下载最近稳定的版本。 就是那个以没有被标记作为alpha或Beta发行的最高的版本。目前最稳定的版本是Python3.0以上 [2]

    如果你使用的操作系统是Windows:当前最稳定的Windows版本下载是”Python 3.8.0 for Windows”

    如果你使用的是Mac,MacOS 10.2 (Jaguar), 10.3 (Panther) and 10.4 (Tiger)已经集成安装了Python,但是你大概需要安装最近通用的构架(build)。

    对于Red Hat,安装python2和python2-devel包。

    对于Debian,安装python2.5和python2.5-dev包。

    发展历程

    编辑

    自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。

    Python的创始人为荷兰人吉多·范罗苏姆 [3] (Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提.派森的飞行马戏团》(Monty Pythons Flying Circus)。

    ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是其非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。

    就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

    Python [4] 已经成为最受欢迎的程序设计语言之一。自从2004年以后,python的使用率呈线性增长。Python 2于2000年10月16日发布,稳定版本是Python 2.7。Python 3于2008年12月3日发布,不完全兼容Python 2。 [3] 2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。 [5]

    由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩

    标识

    展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。 [6]

    风格

    编辑

    Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

    设计者开发时总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。这在由Tim Peters写的Python格言(称为The Zen of Python)里面表述为:There should be one– and preferably only one –obvious way to do it. 这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(Theres More Than One Way To Do It)完全相反。

    Python的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。

    一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

    与MATLAB的对比

    编辑

    说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB的一些专业性很强的工具箱还无法被替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:

    ● 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。

    ● 其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。

    ● 最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。

    设计定位

    编辑

    Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。

    Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。

    Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。

    虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

    Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在Google 内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在操控硬件的场合使用C++,在快速开发时候使用 Python。”

    执行

    编辑

    Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET

    是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。基于C的Python编译出的字节码文件,通常是.pyc格式。除此之外,Python还可以以交互模式运行,比如主流操作系统Unix/Linux、Mac、Windows都可以直接在命令模式下直接运行Python交互环境。直接下达操作指令即可实现交互操作。

    基本语法

    编辑

    Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语

    言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和意外。

    Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如if语句:python3

    1

    2

    3

    4

    if age<21:

    print(“你不能买酒。”)

    print(“不过你能买口香糖。”)

    print(“这句话在if语句块的外面。”)

    根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。

    控制语句

    if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。

    for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。

    while语句,当条件为真时,循环运行语句块。

    try语句,与except,finally配合使用处理在程序运行中出现的异常情况。

    class语句,用于定义类型。

    def语句,用于定义函数和类型的方法。

    pass语句,表示此行为空,不运行任何操作。

    assert语句,用于程序调试阶段时测试运行条件是否满足。

    with语句,Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。

    yield语句,在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。

    raise语句,制造一个错误。

    import语句,导入一个模块或包。

    from import语句,从包导入模块或从模块导入某个对象。

    import as语句,将导入的对象赋值给一个变量。

    in语句,判断一个对象是否在一个字符串/列表/元组里。

    表达式

    Python的表达式写法与C/C++类似。只是在某些写法有所差别。

    主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取余。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。

    Python使用and, or, not表示逻辑运算。

    is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。

    Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:

    >>> sum(x * x for x in range(10))

    285

    Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:

    >>> add=lambda x, y : x + y

    >>> add(3,2)

    5

    Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。

    Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:

    1

    >>> x, y=1,2 # 同时给x,y赋值,最终结果:x=1, y=2

    特别地,可以使用以下这种形式来交换两个变量的值:

    1

    >>> x, y=y, x #最终结果:y=1, x=2

    Python使用(单引号)和”(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。

    Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是…[left:right]或者…[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:

    nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。

    nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。

    nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。

    nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。

    nums[1:5:2] == [3, 7] 从下标为1的元素切割到下标为5的元素,且步长为2。

    函数

    Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。比如:

    >>> def randint(a, b):

    … “Return random integer in range [a, b], including both end points.”…

    >>> help(randint)

    Help on function randint in module __main__:

    randint(a, b)

    Return random integer inrange[a, b], including both end points.

    对象的方法

    对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用self,用于访问对象的内部数据。这里的self相当于C++, Java里面的this变量,但是我们还可以使用任何其它合法的参数名,比如this 和 mine 等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:

    class Fish:

    def eat(self,food):

    if food is not None:

    self.hungry=False

    class User:

    def__init__(myself,name):

    myself.name=name

    #构造Fish的实例:

    f=Fish()

    #以下两种调用形式是等价的:

    Fish.eat(f,”earthworm”)

    f.eat(“earthworm”)

    u=User(username)

    print(u.name)

    Python认识一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。

    类型

    Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。

    与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish类型,使用Fish()。类型本身也是特殊类型type的对象(type类型本身也是type对象),这种特殊的设计允许对类型进行反射编程。

    Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。下面这个列表简要地描述了Python内置数据类型(适用于Python 3.x):

    类型

    描述

    例子

    备注str一个由字符组成的不可更改的有序串行。Wikipedia”Wikipedia””””Spanningmultiplelines”””在Python 3.x里,字符串由Unicode字符组成bytes一个由字节组成的不可更改的有序串行。bSome ASCIIb”Some ASCII”list可以包含多种类型的可改变的有序串行[4.0, string, True]tuple可以包含多种类型的不可改变的有序串行(4.0, string, True)set, frozenset与数学中集合的概念类似。无序的、每个元素唯一。{4.0, string, True}frozenset([4.0, string, True])dict一个可改变的由键值对组成的无序串行。{key1: 1.0, 3: False}int精度不限的整数42float浮点数。精度与系统相关。3.1415927complex复数3+2.7jbool逻辑值。只有两个值:真、假TrueFalse

    除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。

    数学运算

    Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数abs()外,大多数数学函数处于math和cmath模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:

    >>> import math

    >>> print(math.sin(math.pi/2))

    1.0

    fractions模块用于支持分数运算;decimal模块用于支持高精度的浮点数运算。

    Python定义求余运行a % b的值处于开区间[0, b)内,如果b是负数,开区间变为(b, 0]。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式:b * (a // b) + a % b = a恒真,整除运行需要向负无穷小方向取值。比如7 // 3的结果是2,而(-7) // 3的结果却是-3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。

    Python允许像数学的常用写法那样连着写两个比较运行符。比如a < b < c与a < b and b < c等价。C++的结果与Python不一样,首先它会先计算a < b,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。

    帮助

    编辑

    1. 列出模块中的函数

    用import导入模块后,可使用函数dir(m)列出模块的所有函数,import是导入模块的命令,m是模块名。

    例子:

    >>>import math

    >>>dir(math)

    [__doc__, __loader__, __name__, __package__, __spec__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1, fabs, factorial, floor, fmod, frexp, fsum, gamma, gcd, hypot, inf, isclose, isfinite, isinf, isnan, ldexp, lgamma, log, log10, log1p, log2, modf, nan, pi, pow, radians, sin, sinh, sqrt, tan, tanh, tau, trunc

    这个例子列出math模块的一些函数,以双下划线( _ _ )开头的名称用于较复杂的python编程。

    2.查看完整的python内置函数清单

    查看完整的python内置函数清单,可在提示符后输入 >>>dir(_ _builtins_ _)。

    例子:

    >>> dir(__builtins__)

    [ArithmeticError, AssertionError, AttributeError, BaseException, BlockingIOError, BrokenPipeError, BufferError, BytesWarning, ChildProcessError, ConnectionAbortedError, ConnectionError, ConnectionRefusedError, ConnectionResetError, DeprecationWarning, EOFError, Ellipsis, EnvironmentError, Exception, False, FileExistsError, FileNotFoundError, FloatingPointError, FutureWarning, GeneratorExit, IOError, ImportError, ImportWarning, IndentationError, IndexError, InterruptedError, IsADirectoryError, KeyError, KeyboardInterrupt, LookupError, MemoryError, ModuleNotFoundError, NameError, None, NotADirectoryError, NotImplemented, NotImplementedError, OSError, OverflowError, PendingDeprecationWarning, PermissionError, ProcessLookupError, RecursionError, ReferenceError, ResourceWarning, RuntimeError, RuntimeWarning, StopAsyncIteration, StopIteration, SyntaxError, SyntaxWarning, SystemError, SystemExit, TabError, TimeoutError, True, TypeError, UnboundLocalError, UnicodeDecodeError, UnicodeEncodeError, UnicodeError, UnicodeTranslateError, UnicodeWarning, UserWarning, ValueError, Warning, WindowsError, ZeroDivisionError, _, __build_class__, __debug__, __doc__, __import__, __loader__, __name__, __package__, __spec__, abs, all, any, ascii, bin, bool, bytearray, bytes, callable, chr, classmethod, compile, complex, copyright, credits, delattr, dict, dir, divmod, enumerate, eval, exec, exit, filter, float, format, frozenset, getattr, globals, hasattr, hash, help, hex, id, input, int, isinstance, issubclass, iter, len, license, list, locals, map, max, memoryview, min, next, object, oct, open, ord, pow, print, property, quit, range, repr, reversed, round, set, setattr, slice, sorted, staticmethod, str, sum, super, tuple, type, vars, zip]

    3. 查看某个函数的

    可以用函数help(函数)来查看某个函数的文档帮助信息。

    例子:

    息。

    例子:

    >>>help(sum)

    Help on built-in function sum in module builtins:

    sum(iterable, start=0, /)

    Return the sum of a start value (default: 0) plus an iterable of numbers When the iterable is empty, return the start value.

    This function is intended specifically for use with numeric values and may reject non-numeric types.

    可以直接在提示符下输入help(),然后输入某个模块或函数名得到详细的帮助信息。

    CGI

    编辑

    CGI 目前由NCSA维护,NCSA定义CGI如下: [4]

    CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。

    CGI程序可以是Python脚本、Perl脚本、Shell脚本、C或者C++程序等。

    服务器

    在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序。

    所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录,并按照惯例,它被命名为/var/www/cgi-bin目录。

    CGI文件的扩展名为.cgi,python也可以使用.py扩展名。

    默认情况下,Linux服务器配置运行的cgi-bin目录中为/var/www。

    如果想指定的其他运行CGI脚本的目录,可以修改httpd.conf配置文件,如下所示:

    <Directory”/var/www/cgi-bin”>

    Allow Override None

    Options ExecCGI

    Order allow,deny

    Allow from all

    </Directory>

    <Directory”/var/www/cgi-bin”>

    Options All

    </Directory>

    程序

    使用Python创建第一个CGI程序,文件名为hello.py,文件位于/var/www/cgi-bin目录中,内容如下,修改文件的权限为755:[4]

    #!/usr/bin/env python

    print(“Content-type:text/html\r\n\r\n”)

    print(“<html>”)

    print(“<head>”)

    print(“”)

    print(“</head>”)

    print(“<body>”)

    print(“<h2>Hello World! This is my first CGI program</h2>”)

    print(“</body>”)

    print(“</html>”)

    以上程序在浏览器访问显示结果如下:

    1

    Hello World! This is my first CGI program

    这个的hello.py脚本是一个简单的Python脚本,脚本第一的输出内容”Content-type:text/html\r\n\r\n”发送到浏览器并告知浏览器显示的内容类型为”text/html”。

    环境变量

    所有的CGI程序都接收以下的环境变量,这些变量在CGI程序中发挥了重要的作用: [4]

    变量名

    描述

    CONTENT_TYPE

    这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:

    application/x-www-form-urlencoded,他表示数据来自于HTML表单。

    CONTENT_LENGTH

    如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。

    HTTP_COOKIE

    客户机内的 COOKIE 内容。

    HTTP_USER_AGENT

    提供包含了版本数或其他专有数据的客户浏览器信息。

    PATH_INFO

    这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。

    QUERY_STRING

    如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号?分隔。

    REMOTE_ADDR

    这个环境变量的值是发送请求的客户机的IP地址,例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。

    REMOTE_HOST

    这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。

    REQUEST_METHOD

    提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。

    SCRIPT_FILENAME

    CGI脚本的完整路径

    SCRIPT_NAME

    CGI脚本的的名称

    SERVER_NAME

    这是你的 WEB 服务器的主机名、别名或IP地址。

    SERVER_SOFTWARE

    这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。例如,上面的值为Apache/2.2.14(Unix)

    以下是一个简单的CGI脚本输出CGI的环境变量:

    1

    2

    3

    4

    5

    6

    #!/usr/bin/python

    import os

    print”Content-type:text/html\r\n\r\n”

    print”Environment”

    for param in os.environ.keys():

    print”<b>%20s</b>:%s<\br>” %(param,os.environ[param])

    特点

    编辑

    优点

    简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。

    易学:Python极其容易上手,因为Python有极其简单的说明文档 [7] 。

    速度快:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。 [4]

    免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。

    高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

    可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基于linux开发的android平台。

    解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。

    运行程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行 程序。

    在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。

    面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。

    可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。

    可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。

    丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

    规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。

    缺点

    单行语句和命令行输出问题:很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。

    独特的语法

    这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。

    运行速度慢:这里是指与C和C++相比。

    应用

    编辑

    系统编程:提供API(Application Programming Interface应用程序编程接口),能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。

    图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。

    数学处理:NumPy扩展提供大量与许多标准数学库的接口。

    文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。

    数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。

    网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。

    Web编程:应用的开发语言,支持最新的XML技术。

    多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。

    pymo引擎:PYMO全称为python memories off,是一款运行于Symbian S60V3,Symbian3,S60V5, Symbian3, Android系统上的AVG游戏引擎。因其基于python2.0平台开发,并且适用于创建秋之回忆(memories off)风格的AVG游戏,故命名为PYMO。

    黑客编程:python有一个hack的库,内置了你熟悉的或不熟悉的函数,但是缺少成就感。

    用Python写简单爬虫

    首先,要通过urllib2这个Module获得对应的HTML源码。(PS:在python3.3之后urllib2已经不能再用,代之以urllib)

    import urllib2 #调用urllib2

    url=http://www.baidu.com/s?wd=cloga #把等号右边的网址赋值给url

    html=urllib2.urlopen(url).read() #html随意取名 等号后面的动作是打开源代码页面,并阅读

    print html #打印

    通过上面这三句就可以将URL的源码存在content变量中,其类型为字符型。

    接下来是要从这堆HTML源码中提取我们需要的内容。用Chrome查看一下对应的内容的代码(也可以用Firefox的Firebug)。

    可以看到url的信息存储在span标签中,要获取其中的信息可以用正则表达式。

    工具功能

    编辑

    Tkinter

    Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。

    PyGTK

    用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的库。

    PyQt

    用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。

    wxPython

    GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构(对于初学者或者对设计要求不高的用户来说,使用Boa Constructor可以方便迅速的进行wxPython的开发)属于外置库,要先下载。

    PIL

    python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。

    Psyco

    一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。

    xmpppy

    Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。

    PyMedia

    用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。

    Pmw

    Python megawidgets,Python超级GUI组件集,一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。

    PyXML

    用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:

    xmlproc: 一个符合规范的XML解析器。Expat: 一个快速的,非验证的XML解析器。还有其他和他同级别的还有 PyHtml PySGML。

    PyGame

    用于多媒体开发和游戏软件开发的模块。可以直接使用pip install pygame下载

    PyOpenGL

    模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。

    NumPy、NumArray、SAGE

    NumArray是Python的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的底层代码使用C来编写,所以速度的优势很明显。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代Magma, Maple, Mathematica和Matlab 这类工具。

    MySQLdb

    用于连接MySQL数据库。还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据

    用于连接sqlite数据库。

    sqlite数据库。

    Python-ldap

    提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。

    smtplib

    发送电子邮件。

    ftplib

    定义了FTP类和一些方法,用以进行客户端的ftp编程。如果想了解ftp协议的详细内容,请参考RFC959。

    PyOpenCL

    OpenCL的Python接口,通过该模块可以使用GPU实现并行计算。

    标准库

    编辑

    Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。

    Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。第三方模块可以使用Python或者C语言编写。SWIG,SIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一组库,Boost.Python,使得以 Python 或 C++ 编写的程序能互相调用。借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的胶水语言。

    Python标准库的主要功能有:

    文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能

    文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能

    操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能

    网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能

    网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架

    W3C格式支持,包含HTML,SGML,XML的处理

    其它功能,包括国际化支持、数学运算、HASH、Tkinter等

    开发环境

    编辑

    ●IDLE:Python内置IDE (随python安装包提供)

    ●PyCharm [8] :详见百度百科PyCharm,由著名的JetBrains公司开发,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工 具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

    ●Komodo和Komodo Edit:后者是前者的免费精简版

    ●Spyder:安装Anaconda自带的高级IDE

    ●PythonWin:ActivePython或pywin32均提供该IDE,仅适用于Windows

    ●SPE(Stanis Python Editor):功能较多的自由软件,基于wxPython

    ●Ulipad:功能较全的自由软件,基于wxPython;作者是中国Python高手limodou

    ●WingIDE:可能是功能最全的IDE,但不是自由软件(教育用户和开源用户可以申请免费key)

    ●Eric:基于PyQt的自由软件,功能强大。全名是:The Eric Python IDE

    ●DrPython

    ●PyScripter:使用Delphi开发的轻量级的开源Python IDE, 支持Python2.6和3.0。

    ●PyPE:一个开源的跨平台的PythonIDE。

    ●bpython: 类Unix操作系统下使用curses库开发的轻量级的Python解释器。语法提示功能。

    ●eclipse + pydev插件:方便调试程序

    ●emacs:自带python支持,自动补全、refactor等功能需要插件支持

    ●Vim: 最新7.3版编译时可以加入python支持,提供python代码自动提示支持

    ●Visual Studio 2003 + VisualPython:仅适用Windows,已停止维护,功能较差

    ●SlickEdit

    ●Visual Studio 2010 + Python Tools for Visual Studio

    ●TextMate

    ●Netbeans IDE

    ●Sublime

    ●ipython

    另外,诸如Notepad++、EditPlus、UltraEdit等通用的程序员文本编辑器软件也能对Python代码编辑提供一定的支持,比如代码自动着色、注释快捷键等,但是否够得上集成开发环境的水平,尚有待评估。

    解释器

    编辑

    Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。

    CPython(ClassicPython,也就是原始的Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。

    Jython(原名JPythonJava语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。

    PyPy(使用Python语言写的Python)

    IronPython(面向.NET和ECMA CLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。

    ZhPy(周蟒)(支持使用繁/简中文语句编写程序的Python语言)

    著名应用

    编辑

    Digwebs-Web应用框架

    Pylons-Web应用框架

    Zope- 应用服务器

    Plone- 内容管理系统

    Django- 鼓励快速开发的Web应用框架

    Uliweb- 国人开发的轻量级Web框架

    TurboGears- 另一个Web应用快速开发框架

    Twisted–Python的网络应用程序框架

    Python Wikipedia Robot Framework- MediaWiki的机器人程序

    MoinMoinWiki- Python写成的Wiki程序

    flask- Python 微Web框架

    tornado- 非阻塞式服务器

    Webpy- Python 微Web框架

    Bottle- Python 微Web框架

    EVE- 网络游戏EVE大量使用Python进行开发

    Reddit – 社交分享网站

    Dropbox – 文件分享服务

    TurboGears – 另一个Web应用快速开发框架

    Fabric – 用于管理成百上千台Linux主机的程序库

    Trac – 使用Python编写的BUG管理系统

    Mailman – 使用Python编写的邮件列表软件

    Mezzanine – 基于Django编写的内容管理系统

    Blender – 以C与Python开发的开源3D绘图软件

    库导入

    编辑

    内置库

    可以直接使用 import语句导入。

    外部库

    需要先下载,再在CMD命令窗口在pip.exede同级目录下输入 pip install 库名。

    外部库储存在include文件夹中。

    学习网站

    编辑

    Python官方文档英文版 [9]

    Python官方文档中文版 [10]

    python 网络教育-百度传课 [11]

    Python官网 [1]

  • 都说学python,那么python到底是什么呢?

    发展现如今,作为一个ICT从业者,如果你没听说过Python,那就太out了。

    python作为现在最热门的程序语言,拥有超高的人气,可以说是IT界的新一代明星。尤其Python和目前红得发紫的人工智能之间密切的关系,使得大家都对它投入了特别的关注。

    今天,小编就和大家聊一聊,到底什么是Python。

    首先,第一个要解决的问题——“Python”这个词到底怎么发音?

    皮绳 ? 还是排通? 额,实际上,它的英式发音接近于“派森”,美式发音接近于“派杉”。

    这个英文单词的原意是“蟒蛇”或“巫师”。仔细看Python的LOGO,就是2条蟒蛇。它的创造者是荷兰的Guido van Rossum(吉多·范罗苏姆),热爱Python语言的粉丝亲切地称呼他为“龟叔”。

    话说1989年圣诞节,龟叔在阿姆斯特丹的家里闲得无聊。为了打发时间,他决定开发一种新的编程语言。于是,就创造了Python。(IT宅男的世界,一般人无法理解)

    Python这个命名,取自他喜欢看的英国肥皂剧《Monty Python》(飞行马戏团)。

    Python语言诞生之后,其实很长一段时间的发展都只能说是不愠不火。

    1991年,第一个用C语言实现的Python编译器诞生。

    1994年,Python 1.0诞生。

    2000年,Python 2.0 出世,加入了内存回收机制,构成了现在Python语言框架的基础。

    2004年,大名鼎鼎的WEB框架 Django 诞生。

    2008年,Python 3.0发布。Python进入3时代。

    2014年,官方宣布版本2将停止更新。

    截止到2017年10月,最新版本是v 3.6。

    最近几年,随着人工智能、大数据、科学计算、物联网等领域的兴起,Python也水涨船高,成为流行的编程语言之一。目前,Python在一些大的公司和机构已经有了广泛的使用。如Google App Engine 、Google earth 、谷歌爬虫、Google广告等项目都在大量使用Python开发;美国中情局网站就是用Python开发的;世界上最大的视频网站YouTube使用了Python;国内的豆瓣公司几乎所有的业务均是通过Python开发的;国内最大的问答社区知乎是使用Python开发的……根据 IEEE Spectrum 发布的研究报告显示,在 2016 年排名第三的 Python 在今年已经成为世界上最受欢迎的语言

    ,C 和 Java 分别位居第二和第三位。

    Python迅速走红的原因其实是多方面的,小编总结了一下,主要是以下几点:

    1. 容易上手,非常适合编程初学者作为启蒙的语言。

    2. 语法简洁易懂,有点类似英语的表达。我认为,这是未来所有编程语言的雏形。

    3. Python还有个昵称,叫“胶水语言”,是说Python可以很方便地调用别的语言(如C++、Java)编写的功能模块,将他们有机结合在一起形成更高效的新程序。

    4. 丰富、强大的库支持是Python的坚强后盾。

    ……

    Python到底有多简单?我们通过实现打印“Hello World!”,对几个编程语言做个简单的比较:

    首先是C++的实现代码(能看懂不?):

    起到打印作用的是第4行代码。

    然后是Java,好像也不大容易理解:

    真正起打印作用的是第3行代码。

    最后,再看看我们Python的表现:

    起到打印作用的是第4行代码。

    一行代码,直奔主题。搞掂!

    体会到Python语言的魅力吧?它让以前高高在上的计算机编程语言走入寻常百姓家,没有受过专业训练的普通人也可以体验一把码农的快感!

    不过,看上去简单的Python,并没有想象得那么容易学习。

    根据小编的个人经验,具备一定编程基础的IT人员,通过阅读有关的资料,大概3个月左右,就可以初步掌握Python的入门知识。

    如果没有任何计算机基础的小白,需要的学习时间要更长。

    说白了,Python入门容易,但是精通难

    哦,对了,提到Pyhton,就不得不介绍一下,什么是“爬虫”

    很多人以为Python就是爬虫,爬虫就是Python。其实,虽然两者的发音有点接近,但是它们并不是同一样东西。

    爬虫,即网络爬虫(Web Crawler),可以理解为一只蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛。如果它遇到资源,那么它就会抓取下来。具体抓取什么,由你来决定。

    简单来说,Python是一个程序开发语言,而爬虫是一种开发出来的工具(Python是其中一种),“爬”资源,就是一种行为。

    这次就介绍到这里。多说一句,很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“06”即可领取。

  • 深入解析PHP代码审计技术与实战【网络安全】

    前言

    登录某个网站并浏览其页面时,注意到了一些看起来不太对劲的地方。这些迹象可能是该网站存在漏洞或被黑客入侵的标志。为了确保这个网站的安全性,需要进行代码审计,这是一项专门针对软件代码进行检查和分析的技术。在本文中,我们将深入探讨代码审计的重要性和如何进行有效的代码审计。

    1.目录遍历漏洞

    进入模板功能-模板管理功能处。

    这里说句题外话,之前有不少小伙伴私信我要网络安全相关的资源,我这里都整理好了,需要的私信我自取 《黑客&网络安全入门&进阶学习资源包》免费领取

    发现此处的功能点可以遍历目录下的文件,接下来我们抓包查看当前功能点的代码。

    通过路由找到对应的文件 template.php ,然后接着通过 mudi=manage 进行分支选择进入到对应的函数中。

    进入template.php文件。

    在 manage() 函数中,首先传入了两个参数, dirStr 参数则是控制路径的参数,而 sel 参数则是控制是否进入代码的if,而最后将路径传入到File类下的 GetDirList() 函数中。跟进GetDirList() 函数

    发现使用 opendir() 函数列出目录下的文件

    漏洞复现:

    进入模板管理功能处,然后进行抓包。

    抓包之后,进行测试。

    然后在dirStr使用…/../来测试目录穿越。

    2.任意文件读取漏洞

    全局fread() 函数,发现Read()函数中调用了 fread() 函数。

    然后搜索 Read() 函数的调用情况。

    进入classFile.php文件。

    然后搜索fread()函数的用法。

    发现在 sysCheckFile_deal.php 文件中调用了 File::read() 函数,跟进该函数。

    漏洞复现:

    根据路由,去构造url路径,然后访问。

    接着抓包,配合../进行目录穿越读取文件。

    3.任意文件删除漏洞

    在测试模板管理功能点处,发现该处存在一个删除的功能点,发现存在任意文件删除漏洞。

    首先我们通过路由找对相应的源代码 template_deal.php 文件,且这里的路由指向为 DelFile() 函数,该函数中接收了三个参数,其中filePath参数为主要控制路径的参数,将filePath参数带入到File::Del()中进行删除。跟进 del() 函数

    该函数很简单,首先判断路径是否为空,不为空修改权限最后进行文件的删除操作。

    漏洞复现:

    进入功能点处。然后点击X号。

    然后在根路径写入一个xxx.txt文件。

    然后在filepath参数后配合../来删除文件。

    4.msql_getshell

    在 黑盒 测试中中存在一个 SQL语句调试 的功能点,该处没有对SQL语句关键字的过滤而造成SQL语句的任意执行,导致getshell。

    进入功能点处。

    然后执行简单的SQL语句进行测试。

    然后使用抓包工具来定位路由。

    然后看一下代码,发现文件的开头以条件分支来选择对应要执行的功能点,由于上述 mudi=sql ,所以我们找到该处要执行的sql所对应的函数

    通过 OT::PostStr 方法传入五个参数,其中 sqlContent 中是需要传入的SQL语句,而下面对

    into_outfile 、 global general_log 等SQL关键字进行了过滤

    在下面检测你填入的后台密码是否正确,如果正确继续执行下面代码,在代码中执行了我们输入

    的SQL语句。未对其进行过滤完全,导致我们可以绕过过滤,来执行SQL语句。

    漏洞复现:

    首先去开启数据库日志功能,发现有过滤。

    然后我们构造payload成功绕过过滤。

    然后我们写入phpinfp文件。

    构造payload,成功写入。

    访问之后,成功getshell。

    5.xss漏洞

    进入users_deal.php

    检测type是否为数组中的固定值,不是则带入AlertEnd方法中 跟进AlertEnd方法

    发现type被带<script>标签,使用AlertFilter函数处理后直接alert,跟进AlertFilter函数

    漏洞复现:

    构造payload,成功实现弹窗。

    6.xss漏洞2

    进入read.php

    发现在GetCityData函数中,idName参数没有做任何处理,带入GetCituOptionJs函数中跟进该方法

    该方法中idName参数被直接带入DOM方法中输出

    漏洞复现:

    要调用GetCityData函数需mudi参数,然后在idName处输入XSS的payload。

    成功实现弹框。

    7.ssrf漏洞

    在浏览代码过程中,发现该处使用curl_exec()函数来执行命令。

    在函数UseCurl中,调用curl_exec函数执行了一个curl会话,只有$url参数可控,即可造成ssrf漏洞

    进入info_deal.php

    跟进AddOrRev函数

    接着跟进PostStr函数,发现其调用了post函数。

    跟进post函数。

    $img参数通过POST方式传入,并且无过滤措施 继续跟进SaveRemoteFile函数

    第二个参数被带入GetUrlContent函数,跟进GetUrlContent函数

    根据可控参数的带入,跟进UseAuto函数,并且此处传入3个参数 0,GET,$url

    根据传入第一个参数$seMode为0,会调用UseCurl函数,即进入漏洞关键函数

    目前已知漏洞触发链条,接下来只需要根据进入函数的条件,构造poc即可

    首先需要进入AddOrRev函数,只需$mudi值为add

    然后需要满足进入SaveRemoteFile函数的条件

    发现输入的参数为http://,接着来复现漏洞。

    漏洞复现:

    访问url地址,使用post方式,在img参数后面输入dnslog地址。

    成功收到监听。

    ##总结 代码审计可以帮助发现各种类型的漏洞。这些漏洞可能包括输入验证问题、授权问题、会话管理问题、跨站点脚本漏洞、SQL注入漏洞等。

  • PHP实战001:快速搭建本地运行环境(绿色免安装)

    前言

    在开发Php之前我们需要先来搭建一个能够运行php网站的服务器环境,在Window下的需要安装Apache、Php和Mysql的服务器软件(简称WAMP),需要经过一系列的配置方能使用,所以还是比较麻烦的一件事的,不过现在很多公司开发了一键搭建PHP安装环境,方便我们快速进行环境配置,大大节省了搭建PHP环境的时间,这是目前市面上常见的几款一键搭建PHP运行环境工具。

    phpStudy APMServ WampServer Xampp PHPnow ComsenzEXP AppServ PHPCUSTOM UPUPW Nginx PHP程序员工具箱

    一键搭建PHP运行环境

    这里我选择的是PHPCUSTOM,一款Windows系统下纯绿色的PHP集成环境,集成了Apache、Nginx、IIS等Web组件,无须配置解压即可使用,是非常方便、好用的PHP集成开发环境,将PHPCUSTOM解压至任意无中文或空格的目录,然后运行PHPCUSTOM.exe程序,点击启动环境即可(启动服务后可以关闭PHPCUSTOM程序,不影响后台服务)。

    ​验证浏览端口

    默认端口为80,我们在浏览器上输入http://localhost:80即可进入PHPCUSTOM页面,看到如下页面说明我们的环境就已经搭建好了,这里我们可以看到网站根目录在D:/PHPCUSTOM/wwwroot,所以我们的php代码只要放到该目录,系统就会自动检测运行index.php文件了。

    Navicat for MySQL管理数据库

    数据库管理这里我们使用Navicat for MySQL,可连接任何本机或远程MySQL服务器,主要功能包括创建工具或编辑器、数据模型工具、数据传输、导入或导出、数据或结构同步、报表等功能,是一款专为MySQL设计的高性能数据库管理及开发工具。PHPCUSTOM默认数据库用户名为root,密码为root,如忘记密码可使用“强制修改数据库密码”功能修改。

    phpMyadmin管理数据库配置

    如果你觉得麻烦也可以使用PHPCUSTOM自带的数据库管理工具phpMyadmin,这是一款用来操作Mysql数据库的php网站程序,同样可以方便快捷的对数据库进行管理,具体操作在站点管理里面,新建一个站点,名称我们可以直接取phpMyadmin,网站目录选择PHPCUSTOM下的phpmyadmin目录,php版本就选择phpmyadmin所支持的php5.3.9就可以了。

    phpMyadmin管理页面

    然后点击“添加网站”,再重启下服务器就可以访问了,在浏览器中输入http://localhost:8084就可进入phpMyadmin管理页面了,账户密码都是root ,登陆之后我们看到如下图所示页面,在这里我们就可以方面的来管理我们的数据库信息了。

    开发工具

    开发工具这里我选择PhpStorm ,这也是JetBrains 公司针对PHP开发的一款商业的 PHP集成开发工具,可快速理解用户的编码,提供智能代码补全,智能HTML/CSS/JavaScript/PHP编辑、代码质量分析,快速导航以及即时错误检查等功能,可以提高用户开发效率非常适合PHP开发人员,网上有很多绿色版本,直接解压就可以使用了。

    第一个PHP实例

    ​ 我们将wwwroot目录的原有文件打包一份然后删掉,将这个目录作为项目目录,然后在该目录创建一个index.php文件,写句最简单的php代码,比如输出语句echo “Hello word!!!”,这样我们在前台就可以看到该内容了,接下来我们就可以愉快的开发PHP咯。

    欢迎关注本人的公众号:编程手札

    或者搜索公众微信号:ProgramNotes,文章也会在公众号更新

  • a011.PHP实战:加密解密,简单算法入门

    在PHP编程中,很多时候我们会遇到传递信息的问题,而传递过程中为了安全,我们肯定是要进行加密和解密的,这里,我们来说一说使用PHP怎么进行加密解密。

    代码原型:

    代码解析:

    这一次看起来代码好像有点多,不过不要慌,这些都是之前的章节中学习过的,算是复习了吧,只加了一两个新的知识,等下我们对新知识进行讲解。

    echo引起来的这一大堆,大家肯定都不陌生了,之前我们讲过的表单的内容,是要在前端显示的,表单制作好之后,我们再来看本期重点,function,这个是自定义函数,后边跟的是函数名字,名字可以自己取,后边小括号是传值用的,外边的值可以传到函数里去用,使函数可用性变高,再后边大括号内是要执行的命令,一个函数可以有多条命令。

    return是返回数据结果的意思,后边新知识,<<这个不是书名号哦,是两个英文左尖括号,意思是输入,将PI常量输入到$str,同理,>>就是输出的意思了。

    新知识:

    function:自定义函数,可以理解为“方式”,里边就是各种命令。

    <<:输入符号。

    >>:输出符号。

    结语:

    有什么不懂的,可以留言,也可以关注视频版本,最后还是没搞懂的,可以发挥你的聪明才智找到我!

  • PHP实战经验之系统如何支撑高并发

    高并发系统各不相同。比如每秒百万并发的中间件系统、每日百亿请求的网关系统、瞬时每秒几十万请求的秒杀大促系统。

    他们在应对高并发的时候,因为系统各自特点的不同,所以应对架构都是不一样的。

    另外,比如电商平台中的订单系统、商品系统、库存系统,在高并发场景下的架构设计也是不同的,因为背后的业务场景什么的都不一样。

    最简单的系统架构

    假设刚刚开始你的系统就部署在一台机器上,背后就连接了一台数据库,数据库部署在一台服务器上。

    我们甚至可以再现实点,给个例子,你的系统部署的机器是 4 核 8G,数据库服务器是 16 核 32G。

    此时假设你的系统用户量总共就 10 万,用户量很少,日活用户按照不同系统的场景有区别,我们取一个较为客观的比例,10% 吧,每天活跃的用户就 1 万。

    按照 28 法则,每天高峰期算它 4 个小时,高峰期活跃的用户占比达到 80%,就是 8000 人活跃在 4 小时内。

    然后每个人对你的系统发起的请求,我们算他每天是 20 次吧。那么高峰期 8000 人发起的请求也才 16 万次,平均到 4 小时内的每秒(14400 秒),每秒也就 10 次请求。

    好吧!完全跟高并发搭不上边,对不对?

    然后系统层面每秒是 10 次请求,对数据库的调用每次请求都会有好几次数据库操作的,比如做做 crud 之类的。

    那么我们取一个一次请求对应 3 次数据库请求吧,那这样的话,数据库层每秒也就 30 次请求,对不对?

    按照这台数据库服务器的配置,支撑是绝对没问题的。上述描述的系统,用一张图表示,就是下面这样:

    数据库分库分表 + 读写分离

    假设此时用户量继续增长,达到了 1000 万注册用户,然后每天日活用户是 100 万。

    那么此时对系统层面的请求量会达到每秒 1000/s,系统层面,你可以继续通过集群化的方式来扩容,反正前面的负载均衡层会均匀分散流量过去的。

    但是,这时数据库层面接受的请求量会达到 3000/s,这个就有点问题了。

    此时数据库层面的并发请求翻了一倍,你一定会发现线上的数据库负载越来越高。

    每次到了高峰期,磁盘 IO、网络 IO、内存消耗、CPU 负载的压力都会很高,大家很担心数据库服务器能否抗住。

    没错,一般来说,对那种普通配置的线上数据库,建议就是读写并发加起来,按照上述我们举例的那个配置,不要超过 3000/s。

    因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。

    另外一个,压力过大把你的数据库给搞挂了怎么办?

    所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这是作为主库承载写入请求的。

    然后每个主库都挂载至少一个从库,由从库来承载读请求。

    此时假设对数据库层面的读写并发是 3000/s,其中写并发占到了 1000/s,读并发占到了 2000/s。

    那么一旦分库分表之后,采用两台数据库服务器上部署主库来支撑写请求,每台服务器承载的写并发就是 500/s。

    每台主库挂载一个服务器部署从库,那么 2 个从库每个从库支撑的读并发就是 1000/s。

    简单总结,并发量继续增长时,我们就需要 focus 在数据库层面:分库分表、读写分离。

    此时的架构图如下所示:

    缓存集群引入

    接着就好办了,如果你的注册用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。

    然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。

    但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。

    如果你就是简单的不停的加机器,其实是不对的。

    所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。

    所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。

    所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。

    具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。

    这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。

    比如说上面那个图里,读请求目前是每秒 2000/s,两个从库各自抗了 1000/s 读请求,但是其中可能每秒 1800 次的读请求都是可以直接读缓存里的不怎么变化的数据的。

    那么此时你一旦引入缓存集群,就可以抗下来这 1800/s 读请求,落到数据库层面的读请求就 200/s。

    同样,给大家来一张架构图,一起来感受一下:

    按照上述架构,它的好处是什么呢?

    可能未来你的系统读请求每秒都几万次了,但是可能 80%~90% 都是通过缓存集群来读的,而缓存集群里的机器可能单机每秒都可以支撑几万读请求,所以耗费机器资源很少,可能就两三台机器就够了。

    你要是换成是数据库来试一下,可能就要不停的加从库到 10 台、20 台机器才能抗住每秒几万的读并发,那个成本是极高的。

    好了,我们再来简单小结,承载高并发需要考虑的第三个点:

    不要盲目进行数据库扩容,数据库服务器成本昂贵,且本身就不是用来承载高并发的。针对写少读多的请求,引入缓存集群,用缓存集群抗住大量的读请求。

    引入消息中间件集群

    接着再来看看数据库写这块的压力,其实是跟读类似的。

    假如说你所有写请求全部都落地数据库的主库层,当然是没问题的,但是写压力要是越来越大了呢?

    比如每秒要写几万条数据,此时难道也是不停的给主库加机器吗?

    可以当然也可以,但是同理,你耗费的机器资源是很大的,这个就是数据库系统的特点所决定的。

    相同的资源下,数据库系统太重太复杂,所以并发承载能力就在几千/s的量级,所以此时你需要引入别的一些技术。

    比如说消息中间件技术,也就是 MQ 集群,它可以非常好的做写请求异步化处理,实现削峰填谷的效果。

    假如说,你现在每秒是 1000/s 次写请求,其中比如 500 次请求是必须请求过来立马写入数据库中的,但是另外 500 次写请求是可以允许异步化等待个几十秒,甚至几分钟后才落入数据库内的。

    那么此时你完全可以引入消息中间件集群,把允许异步化的每秒 500 次请求写入 MQ,然后基于 MQ 做一个削峰填谷。

    比如就以平稳的 100/s 的速度消费出来,然后落入数据库中即可,此时就会大幅度降低数据库的写入压力。

    此时,架构图变成了下面这样:

    大家看上面的架构图,首先消息中间件系统本身也是为高并发而生,所以通常单机都是支撑几万甚至十万级的并发请求的。

    所以,它本身也跟缓存系统一样,可以用很少的资源支撑很高的并发请求,用它来支撑部分允许异步化的高并发写入是没问题的,比使用数据库直接支撑那部分高并发请求要减少很多的机器使用量。

    而且经过消息中间件的削峰填谷之后,比如就用稳定的 100/s 的速度写数据库,那么数据库层面接收的写请求压力,不就成了 500/s + 100/s = 600/s 了么?

    大家看看,是不是发现减轻了数据库的压力?到目前为止,通过下面的手段,我们已经可以让系统架构尽可能用最小的机器资源抗住了最大的请求压力,减轻了数据库的负担:

    系统集群化。数据库层面的分库分表+读写分离。针对读多写少的请求,引入缓存集群。针对高写入的压力,引入消息中间件集群。

    初步来说,简单的一个高并发系统的阐述是说完了。但是,故事到这里还远远没有结束。

    首先,高并发这个话题本身是非常复杂的,远远不是一些文章可以说的清楚的,它的本质就在于,真实的支撑复杂业务场景的高并发系统架构其实是非常复杂的。

    比如说每秒百万并发的中间件系统、每日百亿请求的网关系统、瞬时每秒几十万请求的秒杀大促系统、支撑几亿用户的大规模高并发电商平台架构,等等。

    为了支撑高并发请求,在系统架构的设计时,会结合具体的业务场景和特点,设计出各种复杂的架构,这需要大量底层技术支撑,需要精妙的架构和机制设计的能力。

    最终,各种复杂系统呈现出来的架构复杂度会远远超出大部分没接触过的同学的想象。

    但是那么复杂的系统架构,通过一些文章是很难说的清楚里面的各种细节以及落地生产的过程的。

    其次,高并发这话题本身包含的内容也远远不止本文说的这么几个 topic:分库分表、缓存、消息。

    一个完整而复杂的高并发系统架构中,一定会包含:

    各种复杂的自研基础架构系统。各种精妙的架构设计(比如热点缓存架构设计、多优先级高吞吐 MQ 架构设计、系统全链路并发性能优化设计,等等)。还有各种复杂系统组合而成的高并发架构整体技术方案。还有 NoSQL(Elasticsearch 等)/负载均衡/Web 服务器等相关技术。

    所以大家切记要对技术保持敬畏之心,这些东西都很难通过一些文章来表述清楚。

    最后,真正在生产落地的时候,高并发场景下你的系统会出现大量的技术问题。

    比如说消息中间件吞吐量上不去需要优化、磁盘写压力过大性能太差、内存消耗过大容易撑爆、分库分表中间件不知道为什么丢了数据,等等。

  • a009.PHP实战,判断用户权限,逻辑运算符的使用

    在使用PHP过程中,我们可能会设计到判断用户是否有权限操作本内容的情况,对用户进行分类,这里我们给大家说一下使用PHP中逻辑运算符来判断用户的权限!

    代码原型:

    这里我来给大家讲一下代码中的意思,首先要给一个表单框架<form></form>这个是成对的,不要写掉了,然后在框架中,给一个input,这个是你要提交的数据内容,有好几种类型,比较常用的如下:

    text:这种类型是文字输入框

    password:这是密码输入框

    submit:这是提交按钮

    常用的就这三种,当然,还有隐藏之类的其它类型,这个在以后的文章中,我们再详细的描述,有了这几个部分组成基本就可以正常运行了,但为了要交互,还需要填写一些信息,在form中有:

    action:这里填要提交的地址,为空则提交给当前网址

    method:提交数据采用的方式,一般为GET或POST

    搞完表单之后,我们就可以搞php这一部分了,php这部分很简单,就是判断一个有没有POST或GET数据传过来,没有的话,就正常显示表单,有的话就进行判断,isset()这个函数是用来判断POST里有没有数据的,而下边那个if是在有数据的情况下,判断账号是不是等于mr,还有密码是不是等于mrsoft,成立则显示有权限,不成立则显示没有权限!

    在实际应用中,大家按思路自己置换下就能进行生产了。

    新知识:

    &&:数学中‘并’的关系,意思是账号和密码都满足才进行下边的动作

    ==:数学中等于的意思,与!=相反

    _POST:接收的所有post数据都是变量下划线post,get同理,$_GET

    结语:

    如果本文中还有什么你不明白的,可以看视频版,也可以发挥你的聪明才智联系我,也可以自己冥思苦想!

  • PHP高并发高负载下的3种实战场景解决方法

    前言:

    在实际开发项目中,产品一旦推广开来,总能遇到一些小问题。比如某个接口突然就请求崩掉了,某个提交接口明明做了限制为什么就多出了好多重复的记录。还有是某个记录超过限制进行修改了,以下就以这几个小问题总结一下平时采取的解决方法。

    场景:

    1. 缓存失效场景,就比如某个接口做了数据缓存,缓存过期导致突然某个时刻大量请求直接读数据库。解决方法设置redis缓存回调事件,订阅失效频道。所以这个也可以用来处理某些业务场景到期处理方式。

    2. 接口幂等性场景,就比如注册接口,通过手机号查询是否存在记录。但有时出现网络延迟用户连点等情况,会出现数据库出现几条一样的用户数据记录。

    3. 商品库存超卖场景,比如某个活动商品下单,多个用户同时下一个商品的订单,从而导致库存超卖的现象。解决方法可以使用乐观锁或者悲观锁解决此问题。

    场景一,缓存失效回调。

    1. 设置Redis回调事件方法。

    (1). 打开Redis客户终端,输入命令

    非持久性的回调事件设置 config set notify-keyspace-events Ex

    (2). windows平台打开Redis安装目录中找到”

    redis.windows-service.conf”,然后打开编辑找到notify-keyspace-events那一行,去掉”#”,改为notify-keyspace-events “Ex”。

    (3). 其中Redis还可以设置订阅键名的回调,比如订阅某个键名的del操作等,可以在conf中设置不同的,方法网上也有的。

    2. 订阅redis某个库的键失效的频道名,可以在命令测试,也可以通过PHP代码订阅然后cli环境下运行脚本。

    命令: subscribe __keyevent@0__:expired

    3. 重新打开一个新的redis客户终端输入一个带有效期的键值对,如下

    (键名test_key_name, 时间30s, 值ceshi)命令: setex test_key_name 30 ceshi

    4. 查看键失效回调订阅的命令窗口是否出现失效的键名。

    5. 代码实现键名的失效事件订阅。

    <?php //设置php脚本执行时间 set_time_limit(0); //设置socket连接超时时间 ini_set(default_socket_timeout, -1); class redisSubscribe { protected $config = [ “host” => “127.0.0.1”, “password” => “6379” ]; protected $redis; public function __construct() { try { $this->redis = new \Redis(); $this->redis->pconnect($this->config[host],$this->config[password]); } catch(\Exception $e) { echo “redis错误:”.$e->getMessage().PHP_EOL; } } // 普通消息订阅 public function normal() { //声明频道名称 $channelName = “test”; try { $this->redis->subscribe([$channelName], function ($redis, $channel, $msg) { echo channel: . $channel . ,message: . $msg . PHP_EOL; file_put_contents(subscribe.log,“\n-“.$msg.“-\n”,FILE_APPEND); }); } catch (\Exception $e) { echo $e->getMessage(); } } // 订阅Key失效事件的频道 public function keyNotify() { echo “wathc keyNotify start~~”.PHP_EOL; // Key事件回调 //$channel = “__keyevent@0__:expired”; // 0号库的Key过期事件频道名 $channel = “__keyevent@*__:expired”; // 所有库的Key过期事件频道名 try { $this->redis->subscribe([$channel], function ($redis, $channel, $msg) { echo channel: . $channel . =========== . ,message: . $msg . PHP_EOL; file_put_contents(subscribe.log,“\n-“.$msg.“-\n”,FILE_APPEND); }); } catch (\Exception $e) { echo $e->getMessage(); } } } (new redisSubscribe())->keyNotify(); ?>

    6. 通过PHP-cli运行该脚本,然后也可以setex一个短时间的键,然后查看命令是否输出该失效的键名。

    7. 实际项目中的缓存失效的应用就可以展开了。

    (1). 代码中设置的所有键名都配置到项目的全局配置文件中。

    (2). 服务器中开一个守护进程(持续运行订阅某个库或者所有库的键失效回调事件脚本)。

    (3). 当该脚本有回调时,取出键名去全局缓存键名数组中匹配。

    (4). 规则业务可以自行设计。

    (5). 比如取出一个”cate5″的键名,则可以取资讯表中查询分类ID为5的所有数据然后再进行缓存。

    (6). 缓存失效事件还一个高端玩法,就是取代某些定时任务。比如可以将某个订单作为键名缓存,当该键名失效就可以取出键名拿到ID去数据库中将订单状态修改为失效。

    场景二,接口幂等性。

    接口重复数据也就是在高并发下的数据添加场景。最典型的是注册接口,用户在网络延迟大或者信号不稳定的情况下。并且同时大量用户在进行注册操作,用户点击了一次没反应然后再次点击多个。

    在没有做幂等性处理只是拿到手机号查询数据库是否存在,用户表又没分库分表,查询缓慢,查询出来后,多条并发的请求都绕过了手机号已经存在的条件判断,所以就出现了ID不同,但是其他字段一样的记录。

    1. 对于高并发数据添加,可以使用Redis的setnx。

    2. setnx是设置键并且在有效期内有值时,再次对该键名进行重复赋值无法进行,会返回0。

    3. 可以代码在对某些条件查询是否存在时,可以将条件组成键名赋值。添加记录时再次对键名重新赋值,返回null则表示已经存在。

    4. 以下代码是项目中的一个测试方法,使用的redis是封装的,借鉴需要修改。

    /** * @Notes: 高并发防止重复提交(插入数据) 【保证接口的幂等性】 * @Interface preventRepeatSubmit * @return mixed * @author: bqs * @Time: 2020/6/19 14:56 */ public function preventRepeatSubmit() { /* 比如查询某条(什么条件)记录是否存在,分布式锁机制[redis的原子性setnx] * 1. 通过条件拼接为唯一的键名,将键名setnx设置一个30s有效期的值 * 2. setnx设置键名不成功(返回0)表示已经存在,接口则直接返回记录已经存在 * 3. 根据该条件查询数据库记录,如果存在,接口再返回记录已经存在 * 【只要添加记录前需要查询什么是否存在则都需要考虑高并发情况,则通过此方案】 */ $redis = Redis::db(0); $no = date(YmdHis,time()).mt_rand(1000,9999); //$no = 202006191537447811; // 是否添加锁表 $addLock = false; if ($redis->setnx($no,1)) { $redis->expire($no,30); //设置30s过期时间 } else { $addLock = true; // 订单已经存在则锁住 } // 数据库查询是否存在 $isExist = Db::name(ztest)->where([no=>$no])->find(); if ($isExist) { $addLock = true; } if (!$addLock) { $data = [ “no” => $no, “tab_num” => 2, “stock” => 20, “create_time” => time() ]; $res = Db::name(ztest)->insertGetId($data); } return “添加数据成功”; }

    场景三,库存超卖。

    库存超卖是一个很常见的秒杀或者其他高并发场景下的数据更新问题。网络上的解决方法也是多种多样,对该问题延伸的数据库乐观锁,悲观锁的知识点也是数不胜数。

    所以,这里我也不再介绍数据库的存储引擎机制,事务,表锁等概念。直接以代码展现,以下是以乐观锁实现的数据库更新问题。

    1. 高并发下,对单条记录的修改。一般修改前会对某字段进行判断,但是并发情况下,拿查询的结果进行拦截是极其的不靠谱。不过也可以对查询进行加锁,但是需要在同一事务中。

    2. 库存字段添加无符号的字段约束,所以再大的并发在修改为0之后也不会出现负数了,在修改的操作时捕捉修改为负数时的数据库异常。

    3. 表中添加version字段,这个也是网上盛传的乐观锁经典实例了,后面的原理和流程我就不介绍了,代码也是这样写的,所以直接贴代码了。

    /** * @Notes: 高并发乐观锁 – (更新数据) * @Interface testConcurrence * @return mixed * @author: bqs * @Time: 2020/6/19 14:25 */ public function testConcurrence() { // 开启事务 Db::startTrans(); // 查询ID25当前的库存和版本号 $curr = Db::name(ztest)->field(stock,version)->where([id=>25])->find(); // 判断库存是否小于0 if ($curr && $curr[stock] <= 0) { throw new \Exception(物品已售罄,302); } try { // 修改库存 – 获取ID25的行琐 $updateRes = Db::name(ztest)->where([id=>25,version=>$curr[version]])->update([stock=>$curr[stock]-1,version=>$curr[version]+1]); // 标识并发过来修改的,拿到的version太旧,事务回滚重新回到查询再走一遍 if (!$updateRes) { Db::rollback(); } } catch(\Exception $e) { Db::rollback(); // 记录日志,或者返回 } // 事务提交 Db::commit(); return 购买成功了; }