php代码怎么缩进,专用语言的特点?
1.c语言
是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到c语言,始于编写程序软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。
优点:简洁紧凑,灵活方便,运算符丰富,数据类型丰富,c是结构式语言,语法限制不太严格,程序设计自由度大,生成目标代码质量高,程序执行效率高。
缺点:没有面向对象编程功能(OOPs),运行时类型检查是不可用,C不能够在一个范围内再次使用相同的变量名,构造函数和析构函数不可用,必须通过方法或者以其他方式来手动实现变量的析构和构造。
2.c++
是在c语言的基础上开发的一种面向对象编程语言,应用广泛。它的主要特点表现在两个方面:一是尽量兼容c,二是支持面向对象的方法。它操持了c简洁,高效的接近汇编语言等特点,对c的类型系统进行了改革的扩充。
应用领域:游戏,科学计算,网络软件,分布式应用,操作系统,设备驱动程序,移动设备,嵌入式系统,教育与科研,部分行业应用,其他应用。
3.c#
是微软对这一问题的解决方案。C#是一种最新的、面向对象的编程语言。
主要特点:简单,现代,面向对象的,类型安全,相互兼容性,可伸缩性和可升级性。
主要领域:web应用,客户端应用,分布式计算,人工智能,各类游戏。
4.visual 语言
一种直译式程序设计语言。名称字面为意思“初学者的全方位符式指令代码”,设计给初学者使用的编程语言,在完成编写后不须经由编译及链接等手续,经过解释器即可运行,但如果需要单独运行时仍然需要将其创建成可执行文件。
特点:(1)面向对象和可视化的程序设计。
(2)事件驱动的运行机制。
(3)结构化的程序设计语言。
(4)多种数据库访问能力。
(5)提供了功能完备的应用程序集成开发环境。
(6)方便使用的联机帮助功能。
5.perl 语言
是一种解释型的脚本语言。Perl语言由Larry wall干1986年开发成功。当初的目的主要是在Unix环境下,用于处理面向系统任务而设计的脚本编程语言。Perl对文件和字符有很强的处理、变换能力,它特别适用于有关系统管理、数据库和网络互联以及WWW程序设计等任务,这样使得Perl称为系统维护管理者和CGI编制者的首选工具语言。
特点:
1. Perl的解释程序是开放源码的免费软件,使用Perl不必担心费用。
2. Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移。
3. Perl 是一种能完成任务的语言。从一开始,Perl 就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。它可以很容易操作数字,文本,文件和目录,计算机和网络,特别是程序的语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西。而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理。当然,这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行。
6.java
是一门面向对象编程语言,不仅吸收了c++语言的各种优点,还摒弃了c++里难以理解的多继承,指针等概念,因此java语言具有功能强大和简单易用两个特征。java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
特点:简单性,面向对象,分布性,编译和解释性,稳健性,安全性,可移植性,高能性,多线索性,动态性。
应用:android应用,在金融业应用的服务器程序,网站,嵌入式领域,大数据技术,高频交易的空间,科学领域。
7.Objective-C
通常写作ObjC或OC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。
特点:1、动态运行环境,适合UI编程
在Objective-C中,如下语法并非单纯的函数调用,而是向某对象发送消息。
2、方便与C/C++混合使用
Objective-C中的C扩展部分,使用符号@开头。比如@class、@interface、@"Hello,World"。而它的消息发送语法则是使用中括号而不是圆括号。
3、运行速度相对较快
Objective-C编译后是机器原生指令,运行时环境也小而紧凑。它采用引用计数的内存管理方式,并引入ARC。ARC比GC更容易引起编程错误,但却比GC快。而在性能很重要的场合,Objective-C也很容易直接调用C/C++代码。相对于其他使用虚拟机、采用GC以及间接调用C/C++的移动平台,速度优势非常明显。
应用:ios操作系统,ios应用程序,mac os x操作系统,mac osx上的应用程序。
8.PHP
是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
特点:
1. PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。
2. PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比,
PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多;
PHP具有非常强大的功能,所有的CGI的功能PHP都能实现。
3. PHP支持几乎所有流行的数据库以及操作系统。
4. 最重要的是PHP可以用C、C++进行程序的扩展!
9.python
是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议 。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
特点:简单,易学,速度快,免费、开发,高层语言,可移植性,解释性,面向对象,可扩展性。
应用:
系统编程,图形处理,数学处理,文本处理,数据库编程,网络编程,多媒体应用,pymo引擎,黑客编程。
10.Ruby
是一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于Perl、Smalltalk、Eiffel、Ada以及Lisp 语言。
优点
语法简单,普通的面向对象功能(类,方法调用等),特殊的面向对象功能(Mixin,特殊方法等,操作符重载,错误处理功能迭代器和闭包,垃圾回收,动态载入,可移植性高。
各个编程语言都有哪些黑点?
每种编程语言都会有或多或少的黑点吧……速度快的写起来麻烦,写起来简单的速度又慢,所以大家也不要在较真了,用适合自己的语言就好~不过,要说被黑得最惨烈的语言,小慕就不得不先从PHP说起……
PHPPHP招黑一直被业内人士所熟知,因为PHP本来就是Personal Home Page(PHP最初的全称),对于很多程序语言的高级特性并不支持。原作者拉斯姆斯当年无论如何都想不到他只是用来制作个人网页的CGI程序,经过多年的迭代会在业界得到如此广泛的应用。从那个时候开始PHP就被批评不支持面向对象、没有命名空间(namespace)、并不真正支持多线程、弱类型和性能差等,但PHP本身也在不断自我完善和发展,从PHP4开始支持面向对象,从PHP5.3开始支持命名空间和pthreads多线程扩展,在PHP7的版本更新中大幅提升了性能。
除此之外,PHP还经常被批评函数名混乱,因为在长年累月的迭代中,为了保证程序的兼容性,很多当年的函数名不可能一言不合说改就改。比如同样是内置函数的getmypid和get_current_user采用了两种不同的命名风格,甚至还有一些形如rtrim的诡异的缩写形式。
PHP:虽然被黑的最惨的总是我,但我还是要说出那句“PHP是最好的语言”。
C++、Java、python、JavaScript:……C++C++几乎是主流语言中最容易让你写出“hello world”的语言,找个ide装上,写完了只需要点一下编译并运行,不用像java还要加环境变量,不用像python还要安装。所有的理工科专业几乎都要开C或C++的课,但当你写过一些代码,并考出计算机二级,觉得自己能用C++找口饭吃的时候,C++就会残忍的告诉你,什么叫“饭里有毒”。
你会发现,自己的c++和官方的c++,就像LOL里己方的“儿童劫”和对面的“火影劫”一样,差距非常夸张。归根结底,是源于C++的复杂性。
Sort源代码片段:
JavaJava就像一个老学究,时时刻刻在警告你 “我认为你这种写法不是很面向对象”。Java过于标准的写法导致了代码十分冗长,在新手眼里可能比较友好,但是在老手眼里却并不这样。因为Java程序员有时候为了少打点字甚至都会修改数据结构,所以即使有代码自动补全也仍会让人头大。
例如把单词的字母放进hashset里,再打印出来。用java写就要比c++冗长的多……
Java:
C++:
再说一个Java的小坑,Java 和 JavaScript 虽然是巴基斯坦和卡巴斯基的关系,但是Java的Integer 还是可以挑战一下JavaScript的九九真值表。
Python缩进
其实游标卡尺的问题真的不能算黑点,整齐的缩进非常有利于程序的可读性。虽然绝大多数编程语言的编译器对缩进并没有什么要求,但是为了代码的可读性,程序员都会写出带有优雅层级的代码。而python干脆把大括号这种范围表示符号省略了,直接用缩进来对代码分层。其实买上一块4k带鱼屏竖起来,一个带有对齐线的开发工具,写python完全就可以为所欲为。
python 可以快速成型,可以为所欲为,但它并不是没有缺点,有时会让一个开发者脱离了计算机科学的基本理念。一个python程序员写的求一个数的阶乘末尾有多少个0的
小算法:
和正确代码比较
代码非常相似,结果完全一样。大家都喊着python慢的,真的只是怪解释型语言的原因吗?
JavaScript同样被黑得够呛的还有JavaScript,这个传说从设计到完工只需10天的编程语言。JavaScript跟Personal Home Page一样,当初可能只是为了实现一些简单的页面交互功能,在应用越来越广泛后,各种缺陷才慢慢开始浮现。比如神奇的隐式类型转换,运算1+”2”的结果是12,JavaScript会自动将整数1转换为字符1,然后与字符2相互拼接,然而1+2+”3”的结果却是33。
除此之外,JavaScript全局变量的使用也极易在不同模块之间产生相互污染,所以很多JavaScript的教材当中都强调要慎用全局变量,或使用闭包,避免造成全局污染。
PerlPerl语言在当年也颇受诟病,比如在一些邋遢、爱炫技的程序员写出的Perl代码,恐怕只有本人才看得明白。因为Perl实在太自由灵活了,再加上诸如@_$%&!<>等各种眼花缭乱符号,你完全可以把程序写成一串天书,跟拿着游标卡尺写出来的Python代码比起来,简直就是两个极端。
另外Ruby的性能差和python2 和python3不兼容也算是黑点,python可能是轮子多太方便了,为了让自己冷静一下,所以一个热门的语言同时流行着两个互不兼容的版本。
被黑较少的语言相对处于所谓dominant地位的,「黑点」最少的应该只有两类。一种比如Haskell和Lisp等「学院派」编程语言,它们处于鄙视链顶端,由于难以真正掌握,一般程序员想黑但无从下手;还有一种是已经渐渐淡出历史舞台的编程语言,比如曾经热门的ASP。
那些在程序员圈子内口口相传,津津乐道的「黑点」,除了因编程语言本身设计和开发遗留的客观因素之外,其实还有一小部分主观因素。比如某编程语言得益于简单易用,很多缺乏理论基础和经验的程序员经过简单培训、短期自学,都能写出可以实现功能但质量可能经不起推敲的代码。如果出于对这部分尚待提高的程序员的排斥,而迁怒于编程语言,小慕认为有失偏颇。
总之无论基于什么理由,只要还在被黑就证明了这门语言还活着。
比如PHP今年在TIOBE排行榜上下降了一位,但依然排名第八;
JavaScript得益于风头正盛的HTML5技术,在移动互联网时代依然大放异彩,甚至凭借Node.js从前端走到了后端。
所以语言避免被黑也取决于:能否在技术上得以不断的自我完善,商业机构或者开源社区是否提供持续的维护,在应用上能否得到业界不断的充实和创新。
其实有些时候,一种语言的缺点也会是它的优点。语言只是工具,只要你用它能达到目的就行啦~
怎么做一个程序员?
任何一个行业都有合格跟不合格的人,当然程序员也不例外。分3步走教您如何成为一个合格的程序员!
个人篇健康的身体,程序员是非常苦逼的职业,天天加班可是家常便饭。所以说程序员必须要有一个健康的身体,身体是革命的本钱。这不仅只在程序员这个行业,其他行业也适用。
持续学习的能力,互联网知识更新非常快,一入编程行业就需要持续的去学习,要不然就会落伍。所以说一个合格的程序员的学习能力非常重要。
动手调试能力,一个合格的程序员动手实践能力应该是非常强的,我编程10多年了,我印象最深的就是每次定位bug,我们的日常生活中绝大部分时间都是在解决bug。所以一位合格的程序员定位bug的能力也是非常强。
过硬的技术知识,公司招程序员是要能干活的,所以一个合格的程序员必须精通自己的专业,自己的专业除了要有深度之外还需要有广度。那如何才能拥有过硬的技术知识呢?
编程是一门技术活,也是脑力活!想成为合格的程序员都是用代码项目喂出来的。平时您要多善于总结,多问自己几个为什么,带着自己的思路去敲代码,多去做项目练习。
家庭篇阿里蒋凡风波都知道吧?如果是一位合格的技术人员的话,一定要处理好家庭关系,不要把家庭上面的一些事情带到工作中去。
公司篇作为一名合格的程序员一定会按时完成公司指派的各项任务,他们不会影响公司的进度,一个合格的程序员除了有清晰的逻辑思维之外,还应该有较强的表达能力。能协调测试,需求等部门。具有较强表达能力的程序员对自己将来的职业规划也很有帮助!可以转管理,去带更多新人。您觉得作为一个合格的程序员还应该做什么?欢迎您的补充!
如何快速精通python?
既然是毫无基础,那就简单介绍一下吧,python的入门其实只需要掌握几个关键点就行,新手要先学会安装环境、了解数据结构、函数这些东西,再配合实操进行实践,基本就可以入门了。
提示!!文章内容较长,大约需要半个小时,可以先收藏再慢慢看,目录如下:
一、了解环境
二、了解数据结构
三、了解基本函数
四、了解Nuypm计算包
——————正文警告!!——————
一、环境Python的编写环境,用Anaconda足矣。Anaconda是专业的数据科学计算环境,已经集成绝大部分包和工具,不需要多余的安装和调试。
Python版本建议3.0以上,不要选择2.7的版本,否则你会被无尽的中文编码问题困扰。
Anaconda在官网下载,选择最新版本,约400MB。
完成安装后,Win版本会多出几个程序,Mac版本只有一个Navigator导航。数据分析最常用的程序叫Jupyter,以前被称为IPython Notebook,是一个交互式的笔记本,能快速创建程序,支持实时代码、可视化和Markdown语言。
点击Jupyter进入,它会自动创建一个本地环境localhost。
点击界面右上角的new,创建一个python文件。
开始你的Python
界面上部是工具栏,编辑撤回运行等,下面是快捷操作,大家以后会熟悉的。页面正中便是脚本执行的地方,我们输入自己第一行代码吧:
(我就不用hello world)灰色框是输入程序的地方,回车是换行,shift+回车执行灰色区域的代码,它的结果会直接在下面空白处出现。这就是Jupyter交互式的强大地方,将Python脚本分成片段式运行,尤其适合数据分析的摸索调整工作。
这里的print叫函数,和excel的函数同理,是程序执行的主体,负责将输入转化成输出(函数留在下一篇细讲)。这里将hello qinlu这段文字输出。新手可能会奇怪为什么要加引号,这种用引号括起来的文字在程序中叫字符串。
Python是一门计算机语言,它的逻辑和自然语言不一样,编程语言的目的是执行任务,所以它不能有歧义。为了规避各种歧义,人们创造了语法规则,只有正确的语法,才能被转换成CPU执行的机器码。
先了解Python语法中的数据类型。计算机最开始只被用于数值运算,后来被赋予了各种丰富的数据类型。
上面两个是小学生都会的四则运算,在计算机语言中可没有那么简单。它涉及了两个数值类型,整数int和浮点数float。整数和浮点数在计算机内部存储的方式是不同的,我们不用知道具体原理,明确一点,整数运算是永远精确的,浮点运算则可能有误差。
两种数据类型也可以互换,通过int函数和float函数。
有了数值,必然有文本,程序中叫字符串,用英文引号括起来表示。单引号和双引号没有区别,所以"qinlu"和'qinlu'是等价的,引号是边界,输出的时候不会包含它。当字符串内本身包含引号时,也不影响使用。
需要注意的是,不论单引号还是双引号,一旦混用很容易出现错误。因为程序并不知道它是字符串的边界还是符号。
解决方法有两种,一种是使用三引号,三引号代表整体引用,而且包含换行。第二种是引号前面加\,它是转义字符,表示这个引号就是单纯的字符。
三引号也可以用来注释,通常是大段的文字解释,如果一句话,我们更习惯用#,#后面的内容均不会作为程序执行。
时间是特殊的数值类型,它将结合datetime模块讲解。
还有两个常见的数据类型,布尔值和空值。布尔值是逻辑判断值,只有True和False。
布尔值在IF语句和数据清洗中经常使用,利用其过滤。布尔值能和布尔值运算,不过这里是and、not、or作为运算符,Ttue and True = True,False and True = False,False and False = False,not True = False,True or False = True等。
空值是一个特殊的值,表示为None,None不等于0,0具有数学意义而None没有,None更多表示该值缺失。
整数,浮点数,字符串,布尔值,空值就是Python常见的数据类型。Python3对中文的支持比较友好,所以大家可以用中文作为字符串试一下print。
数据类型构成了变量的基础,变量可以是任意的数据类型。想要用变量,必须先赋予变量一个值,这个过程叫赋值。
我首先给a赋予了一个整数值1,然后改变它为字符串abc,变量在Python中没有固定的数值类型,这是Python最大的优点,所以它在数据分析中很灵活。这也是它被称为动态语言的原因,相对应的叫静态语言。
Python是大小写敏感的语言,所以a和A是有区别的,这点请牢记。另外变量名尽可能使用英文,不要拼音,英文的可读性是优于拼音的。
变量有两种拼写风格,一种叫驼峰,一种叫下划线,以用户ID为例。驼峰命名法为userId,以一串英文词语user和id组成变量,第一个词语的首字母小写,第二个词语开始的首字母均大写。下划线命名法为user_id,全部小写,用_分割单词。
一个变量的值可以被赋予另外一个变量,如果b变量之前有另外一个值,那么会被1覆盖。呈从上而下的执行关系。
初看a = a + 1好像有逻辑问题,其实这涉及到了程序执行的先后顺序,程序是先计算a+1的值得到2,然后将其赋予(覆盖)了a。等号右边的计算先于左边,这是从右到左的逻辑关系。
有变量,自然有常量,常量是固定不变的量,可是在Python中没有真正意义的常量,一切皆可变,它更多是习惯上的叫法,即一旦赋值,就不再改变了。
Python的基础数学运算符号有+,-,*,/,//,%。前面四个就是加减乘除,其中除法的结果一定是浮点数。后面两个符号是除法的特殊形式,//代表除法中取整数,%代表除法中取余数。
到这里,新手部分已经讲解完成。再来讲讲数据结构。
二、数据结构Python一共有三大数据结构,它是Python进行数据分析的基础,分别是tuple元组,list数组以及dict字典。本文通过这三者的学习,打下数据分析的基础。
1、数组
数组是一个有序的集合,他用方括号表示。
num就是一个典型的数组。数组不限定其中的数据类型,可以是整数也可以是字符串,或者是混合型。
数组可以直接用特定的函数,函数名和Excel相近。
sum是求和,len则是统计数组中的元素个数。
上述列举的函数是数组内整体元素的应用,如果我只想针对单一的元素呢?比如查找,这里就要用到数组的特性,索引。索引和SQL中的索引差不多,都是用来指示数据所在位置的逻辑指针。数组的索引便是元素所在的序列位置。
注意,索引位置是从0开始算起,这是编程语言的默认特色了。num[0]指数组的第一个元素,num[1]指数组的第二个元素。
我们用len()计算出了数组元素个数是5,那么它最后一个元素的索引是4。若是数组内的元素特别多呢?此时查找数组最后一位的元素会有点麻烦。Python有一个简易的方法,可以用负数表示,意为从最后一个数字计算索引。
这里的num[4]等价于num[-1],num[-2]则指倒数第二个的元素。
再来一个新问题,如何一次性选择多个元素?例如筛选出数组前三个元素。在Python中,用:表示范围。
num[0:3]筛选了前三个元素,方括号左边是闭区间,右边是开区间,所以这里是num[0],num[1]和num[2],并不包含num[3]。这个方法叫做切片。
上述是索引的特殊用法,[0:]表示从第0个索引开始,直到最后一个元素。[:3]表示从第一个元素开始,直到第3个索引。
负数当然也有特殊用法。[-1:]表示从最后一个元素开始,因为它已经是最后一个元素了,所以只返回它本身。[:-1]表示从第一个元素开始到最后一个元素。num[-2:-1]和num[-3:-1]大同小异。
数组的增删查
我们已经了解数组的基本概念,不过仍旧停留在查找,它不涉及数据的变化。工作中,更多需要操纵数组,对数组的元素进行添加,删除,更改。
数组通过insert函数插入,函数的第一个参数表示插入的索引位置,第二个表示插入的值。
另外一种方式是append,直接在数组末尾添加上元素。它在之后讲到迭代和循环时应用较多。
如果要删除特定位置的元素,用pop函数。如果函数没有选择数值,默认删除最后一个元素,如果有,则删除数值对应索引的元素。
更改元素不需要用到函数,直接选取元素重新赋值即可。
到这里,数组增删改查已经讲完,但这只是一维数组,一维数组之上还有多维数组。如果现在有一份数据是关于学生信息,一共有三个学生,要求包含学生的姓名,年龄,和性别,应该怎么用数组表示呢?
有两种思路,一种是用三个一维数组分别表示学生的姓名,年龄和性别。
学生属性被拆分成多个数组,利用索引来表示其信息,这里的索引有些类似SQL的主键,通过索引查找到信息。但是这种方法并不直观,实际应用会比较麻烦,更好的方法是表示成多维数组。
所谓多维数组,是数组内再嵌套数组,图中表示的是一个宽度为3,高度为3的二维数组。此时student[0]返回的是数组而不是单一值。这种方法将学生信息合并在一起,比第一个案例更容易使用。
如果想选择第一个学生的性别,应该怎么办呢?很简单,后面再加一个索引即可。
现在尝试快速创建一个多维数组。
[0]*3将快速生成3个元素值为0的数组,这是一种快捷操作,而[row]*4则将其扩展成二维数据,因为是4,所以是3*4的结构。
这里有一个注意点,当我们想更改多维数组中的某一个元素而不是数组时,这种方式会错误。
按照正常的想法,martix[1][0]将会改变第二个数组中的第一个值为1,但是结果是所有数组的第一个值都变成1。这是因为在matrix = [row] * 4操作中,只是创建3个指向row的引用,可以简单理解成四个数组是一体的。一旦其中一个改变,所有的都会变。
比较稳妥的方式是直接定义多维数组,或者用循环间接定义。多维数组是一个挺重要的概念,它也能直接表示成矩阵,是后续很多算法和分析的基础(不过在pandas中,它是另外一种形式了)。
2、元组
tuple叫做元组,它和数组非常相似,不过用圆括号表示。但是它最大的特点是不能修改。
当我们想要修改时就会报错。
而选择和数组没有差异。
元组可以作为简化版的数组,因为它不可更改的特性,很多时候可以作为常量使用,防止被篡改。这样会更安全。
3、字典
字典dict全称dictionary,以键值对key-value的形式存储。所谓键值,就是将key作为索引存储。用大括号表示。
图中的'qinlu'是key,18是value值。key是唯一的,value可以对应各种数据类型。key-value的原理不妨想象成查找字典,拼音是key,对应的文字是value(当然字典的拼音不唯一)。
字典和数组的差异在于,因为字典以key的形式存储和查找,所以它的查询速度非常快,毕竟翻字典的时候你只要知道拼音就能快速定位了。对dict数据结构,10个key和10万个key在查找对应的value时速度没有太大差别。
这种查找方式的缺点是占用内存大。数组则相反,查找速度随着元素的增加逐渐下降,这个过程想象成程序在一页页的翻一本没有拼音的字典,直到找到内容。数组的优点是占用的内存空间小。
所以数组和字典的优缺点相反,dict是空间换时间,list是时间换空间,这是编程中一个比较重要的概念。实际中,数据分析师的工作不太涉及工程化,选用数组或者字典没有太严苛的限制。
细心的读者可能已经发现,字典定义时我的输入顺序是qinlu,lulu,qinqin,而打印出来是lulu,qinlu,qinqin,顺序变了。这是因为定义时key的顺序和放在内存的key顺序没有关系,key-value通过hash算法互相确定,甚至不同Python版本的哈希算法也不同。这一点应用中要避免出错。
既然字典通过key-value对匹配查找,那么它自然不能不用数组的数值索引,它只能通过key值。
如果key不存在,会报错。通过in方法,可以返回True或False,避免报错。
dict和list一样,直接通过赋值更改value
能不能更改key的名字?不能,key一旦确定,就无法再修改,好比字典定好后,你能修改字的拼音么?
dict中删除key和list一样,通过pop函数。增加key则是直接赋予一个新的键值对。
dict的keys和values两个函数直接输出所有的key值和value值。如果要转换成数组,则再外面嵌套一个list函数
items函数,将key-value对变成tuple形式,以数组的方式输出。
字典可以通过嵌套应用更复杂的数据格式,和NoSQL与JSON差不多。
基础的数据类型差不多了,更多函数应用大家可以网上自行查阅文档,这块掌握了,在数据清洗过程中将会非常高效,尤其是读取Excel数据时。当然不要求滚瓜烂熟,因为后面将学习更加强大的Numpy和Pandas。
三、基本函数1. 函数是什么
函数(Functions)是指可重复使用的程序片段。它们允许你为某个代码块赋予名字,允许你通过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是所谓的调用(Calling)函数。
在 Python 中,函数可以通过关键字 def 来定义。这一关键字后跟一个函数的标识符名称,再跟一对圆括号,其中可以包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。
在定义函数时给定的名称称作“形参”(Parameters),在调用函数时你所提供给函数的值称作“实参”(Arguments)。
2. 调用函数
要调用一个函数,需要知道函数的名称和参数。函数的参数只是输入到函数之中,以便我们可以传递不同的值给它,并获得相应的结果。
Python 内置的常用函数包括数据类型转换函数,比如int()函数可以把其他数据类型转换为整数。用input()读取用户的输入:
因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python 提供了int()函数来完成这件事情:
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:
如果函数调用出错,一定要学会看错误信息。
3.定义函数
在 Python 中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
在 Python 交互环境中定义函数时,注意 Python 会出现...的提示。函数定义结束后需要按两次回车重新回到>>>提示符下:
如果你已经把my_abs()的函数定义保存为abstest.py文件了,那么,可以在该文件的当前目录下启动Python 解释器,用from abstest import my_abs来导入my_abs()函数,注意abstest是文件名(不含.py扩展名)。
定义一个什么事也不做的空函数,可以用pass语句:
pass语句什么都不做,实际上它可以用作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
pass还可以用在其他语句里,比如:
缺少了pass,代码运行就会有语法错误。
数据类型检查可以用内置函数isinstance()实现。
Python 的函数返回多值其实就是返回一个tuple;Python 函数返回的是单一值时,返回值仍然是一个tuple。但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值。函数可以同时返回多个值,但其实就是一个tuple。
函数执行完毕也没有return语句时,自动return None。
4.函数的参数
Python 的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
4.1 位置参数:
power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
4.2 默认参数:
对于一些函数来说,你可能为希望使一些参数可选并使用默认的值,以避免用户不想为他们提供值的情况。默认参数值可以有效帮助解决这一情况。你可以通过在函数定义时附加一个赋值运算符=来为参数指定默认参数值。要注意到,默认参数值应该是常数。更确切地说,默认参数值应该是不可变的。
n = 2 是默认参数
定义默认参数要牢记一点:默认参数必须指向不变对象。且只有那些位于参数列表末尾的参数才能被赋予默认参数值,意即在函数的参数列表中拥有默认参数值的参数不能位于没有默认参数值的参数之前。
4.3 可变参数:
有时你可能想定义的函数里面能够有任意数量的变量,也就是参数数量是可变的,这可以通过使用星号来实现。即传入的参数个数是可变的。
我们声明一个诸如 *param 的星号参数时,从此处开始直到结束的所有位置参数(Positional Arguments)都将被收集并汇集成一个称为param的元组(Tuple)。
类似地,当我们声明一个诸如 **param 的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为 param 的字典(Dictionary)。
4.4 关键字参数:
如果你有一些具有许多参数的函数,而你又希望只对其中的一些进行指定,那么你可以通过命名它们来给这些参数赋值——这就是关键字参数(Keyword Arguments)——我们使用命名(关键字)而非位置来指定函数中的参数。
关键字参数允许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
举个例子,扩展函数的功能。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:
4.5 命名关键字参数:
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义函数并调用:
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python 解释器将无法识别位置参数和命名关键字参数,即缺少 *,city和job被视为位置参数。
4.6 参数组合:
在 Python 中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数都可以组合使用。
但是参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。虽然可以组合多达 5 种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。
通过一个tuple和dict,你也可以调用函数:
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
5. 递归函数
如果一个函数在内部调用自身本身,这个函数就是递归函数。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
通过下面的代码可以查看你的电脑最大算到多少:
解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中。Python 标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题
四、了解Mumpy包Python数据分析绝对绕不过的四个包是numpy、scipy、pandas还有matplotlib。
numPy是Python数值计算最重要的基础包,大多数提供科学计算的包都是用numPy的数组作为构建基础。专门用来处理矩阵,它的运算效率比列表更高效。
1、NumPy 的 ndarray:多维数组对象
numpy的数据结构是n维的数组对象,叫做ndarray。可以用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。
创建并操作多维数组:
"/>这里没写 np.float64 只写了 float,但是NumPy会将 Python 类型映射到等价的dtype上。
数组的dtype的另一个用法:
"/>u4(unit32):无符号的 32 位(4个字节)整型。
调用astype无论如何都会创建出一个新的数组(原始数据的一份拷贝)。
浮点数只能表示近似的分数值,在复杂计算中可能会积累一些浮点错误,因此比较操作只在一定小数位以内有效。
4、数组和标量之间的运算
数组:可对数据执行批量运算(不用编写循环即可)。这通常叫做矢量化(vectorization)。
大小相等的数组之间,它们之间任何的算术运算都会应用到元素级(每个元素都做这个运算了),数组与标量的算术运算也是。不同大小的数组之间的运算叫做广播(broadcasting)。5、索引和切片
数据不会被复制,任何修改都直接改了原数组。
如果仅是要一份副本,则用 .copy()。
对二维数组单个元素的索引:
这两种方式等价。
若arr2d[2],则输出的是一维数组[7,8,9]。
2*2*3的数组(2组2行3列):
6、布尔型索引
需要先引入:from numpy.random import randn
或将代码改成:data = np.random.randn(7, 4)
布尔型数组的长度必须跟被索引的轴长度一致。每个名字对应 data 数组一行。
对条件进行否定的两种方式:
组合应用多个布尔条件,可使用&、|等布尔算术运算符
通过布尔型索引选取数组中的数组,将总是创建数据的副本,即使返回一模一样的数组也是一样。
通过布尔型数组设置值:
通过一维布尔数组设置整行或列的值:
7、花式索引
指利用整数数组进行索引。
np.empty((8,4))
Return a new array of given shape and type, without initializing entries.
for i in range(8):
arr[i] = i
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step
为了以特定顺序选取行的子集,只需传入一个用于指定顺序的整数列表或 ndarray,使用负数索引会从末尾开始选取行(最后一行是 -1)。
一次传入多个索引组,返回一个一维数组:
取整列的两种方法,相当于给列排了顺序:
花式索引跟切片不一样,总是将数据复制到新数组中。
数组转置和轴对换
转置返回的是源数据的视图,不进行任何复制操作。数组有 transpose 方法,还有一个 T 属性来完成转置:
8、高维数组
Transpose 要一个轴编号:
<img class="capture deal" src="//s3.pstatp.com/wenda/wenda_web/static/style/image/loading_a788ad0.gif" _src="data:image/svg+xml;utf8,<svg xmlns=" http:="" www.w3.org="" 2000="" svg'="" width="640" height="462">"/>arr是 2 组 2 行 4 列的数组,transpose的参数表示shape的形状,对于这个例子来说,即2[0]、2[1]、4[2],transpose(1,0,2)转置后变为2[1]、2[0]、4[2],看起来仍是 2 组 2 行 4 列的形状,但数组内的元素经过转换后索引已经改变,也要遵循(1,0,2)的顺序。如转置前的数组arr[0,1,0]索引值为 4,转置后的数组arr'[1,0,0],索引值才为 4。其它同理。
ndarray 的 swapaxes 方法接受一对轴编号且返回源数据的视图:
"/>np.meshgrid函数接受两个一维数组,并产生两个二维矩阵(对应于两个数组中所有的(x, y)对。
将条件逻辑表述为数组运算
np.wherea函数是三元表达式x if condition else y的矢量化版本。
np.where的第二个和第三个参数不必是数组,传递给where的数组大小可以不相等,甚至可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。
用where表述出更复杂的逻辑:(where的嵌套)
"/>10、排序
多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort:
顶级方法np.sort返回的数组已排序的副本,就地排序则会修改数组。
唯一化以及其他的集合逻辑
np.unique找出数组中的唯一值并返回已排序的结果
np.in1d用于测试一个数组的值在另一个数组的情况。
Python小白应如何入门?
Python小白怎么入门?这个问题不知道让我怎么回答,因为python可用于多种场景,比如:人工智能呢个、数据分析、数据挖掘、自动化运维、web开发等,都是发展路线。下面介绍一下数据分析的入门及发展学习路线。
0.Python使用工具
1. python基础
2. 数据基础
3. Numpy
4. Pandas
5. Matplotlib
6. 爬虫
7. 机器学习
1.数据分析工具选择
数据分析时,选择一款简单、喜欢的编程工具,将达到事半功倍的效果,这里介绍流行好用的工具
Ø Pycharm:
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,下载地址:https://www.jetbrains.com/pycharm/download/#section=windows
professional 表示专业版,community 是社区版,推荐安装社区版,因为是免费使用的。
Ø Jupyter notebook、Jupyter Lab
Jupyter Notebook 是一个基于 Web 的交互式计算笔记本环境。(https://jupyter-notebook.readthedocs.io/en/stable/notebook.html)
The notebook extends the console-based approach to interactive computing in a qualitatively new direction, providing a web-based application suitable for capturing the whole computation process: developing, documenting, and executing code, as well as communicating the results. The Jupyter notebook combines two components:
A web application: a browser-based tool for interactive authoring of documents which combine explanatory text, mathematics, computations and their rich media output.
Notebook documents: a representation of all content visible in the web application, including inputs and outputs of the computations, explanatory text, mathematics, images, and rich media representations of objects.
Ø Vim
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
Ø Spyter
Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境。和其他的Python开发环境相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值。
2.Python基础
学习顺序如下图所示:
一、基础:数据类型和变量、字符串和编码、 列表、元组、字典、条件判断
循环While循环、For循环、循环嵌套、break语句、continue语句、pass语句、日期和时间、正则表达式
二、函数:调用函数、定义函数、函数参数、递归函数
三、高级特性:切片、迭代、列表生成式、生成器、迭代器
四、面向对象:类和实例、继承和多态、获取对象信息、实例属性和类属性
五、错误、调试和测试、错误处理、调试、单元测试、文档测试
六、Python练习题:
Python100例:
菜鸟教程:https://www.runoob.com/python/python-100-examples.html
力扣 (LeetCode) 全球极客挚爱的技术成长平台:
https://leetcode-cn.com/problemset/all/
Python3中文官方文档网址如下:
http://doc.iplaypy.com/python3/
3.Panda(https://www.pypandas.cn/docs/)
Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
利器之一:DataFrame
DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
利器之一:Series
它是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。
学习视频:
【全30集】使用 pandas 进行数据分析:Data analysis in Python with pandas】
https://www.bilibili.com/video/av6785636?from=search&seid=15880205862713615709
【莫烦PythonàNumpy&Pandas数据处理教程】
https://www.bilibili.com/video/av16378934?from=search&seid=15880205862713615709
4.Numpy科学计算的基础软件包(https://www.numpy.org.cn/user/setting-up.html)
NumPy是使用Python进行科学计算的基础软件包。除其他外,它包括:
功能强大的N维数组对象。精密广播功能函数。集成 C/C+和Fortran 代码的工具。强大的线性代数、傅立叶变换和随机数功能利器之一:Ndarray
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。
利器之一:切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。ndarray 数组可以基于 0 n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
5.Matplotlib
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
为什么选择 Matplotlib?
如果某天你发现自己要学习 Matplotlib, 很可能是因为: 1、Matplotlib 是一个非常强大的 Python 画图工具;2、手中有很多数据, 可是不知道该怎么呈现这些数据。
Matplotlib 能帮你?
绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、、甚至是图形动画等等。
6.爬虫
Beautiful Soup中文教程文档:http://doc.iplaypy.com/bs4/
Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
Requests
Requests中文文档 :(http://doc.iplaypy.com/requests/) 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。
Scrapy
Scrapy官方中文手册,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试...7.数学基础
数据分析进阶版—机器学习
数学基础学习的为:微积分、线性代数、概率论
8.机器学习
机器学习的定义:
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、 逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现 人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构(利用数据 或经验等)使之不断改善自身的性能。
它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的 各个领域,包括网络搜索、垃圾邮件过滤、推荐系统、广告投放、信用评价、欺 诈检测、股票交易和医疗诊断等应用