php中怎么过滤器,bp软件流程?
BP基本操作:
一、常用模块
1、proxy:代理、抓包、改包、默认监听地址是127.0.0.1:8080
2、repeat:HTTP请求消息和响应消息的修改与重复
3、intruder:暴力pj(狙击手、攻城锤、草叉、集束炸弹)
4、decoder:各种编码格式转换
5、scanner:漏洞扫描
6、splider:爬虫
二、常用的快捷键
1、Ctrl+R:将当前请求发送到Repeater
2、Ctrl+I:将当前请求发送到Intruder
3、Ctrl+shift+H:HTMLdecode
4、Ctrl+H:队选中部分中HTML关键字进行HTML encode
5、Ctrl+shift+U:URL decode
6、Ctrl+U:对选中部分中默认需要进行url encode的关键字符进行url encode
三、利用proxy和火狐浏览器的代理对php登录页面进行抓包
对抓取套包利用Do intercep模块进行修改,让页面显示为hello
四、利用repeater模块修改请求消息,并且查看响应的请求消息
五、利用intruder模块对登录密码进行暴力pj
选择clear先清除默认选项
选择密码部分选择add进行添加
在Payloads想设置导入密码字典或者手动添加,你认为可能正确的密码
在Options模块下Grep-Extract添加响应消息的尾部用来判断是否密码正确
在Options模块下Grep-Extract天桥响应消息的尾部用过滤的方式来判断是否密码正确
回到Postions模块下开始攻击,通过回显消息就可以成功查看到正确密码或者查看状态码以及回显字符长度也可以判断出正确的密码
cisp课程目录?
课程目录:
01、CISP-PTE考试解读
【录播】什么是CISP-PTE(7分钟) 免费试学
【录播】CISP-PTE Web安全知识体系(9分钟)
【录播】CISP-PTE考试大纲和重点(7分钟)
02、HTTP协议
【录播】HTTP协议介绍(17分钟)
【录播】HTTP状态码(5分钟)
【录播】HTTP协议响应头信息(2分钟)
【录播】HTTP协议中的URL(5分钟)
03、kali2.0的安装与配置
【录播】kali2020安装(21分钟)
【录播】Kali开启root权限(5分钟)
【录播】VM安装与打开课程所需虚拟机(11分钟)
【录播】Kali安装VMware Tools(10分钟)
【录播】VM安装排错与基本使用(9分钟)
【录播】Kali的网络配置(桥接与NAT)(18分钟)
【录播】Kali配置SSH服务(9分钟)
【录播】Kali更新源(4分钟)
04、Burpsuite2.0介绍
【录播】抓包工具-BurpSuite2.0实战(41分钟)
【录播】Kali安装BurpSuite2.0专业版(26分钟)
【录播】Windows安装BurpSuite2.0专业版(15分钟)
05、BurpSuite2.0核心功能实战
【录播】Burpsuite2.0-Target功能介绍(42分钟)
【录播】BurpSuite2.0-Proxy功能介绍(35分钟)
【录播】BurpSuite2.0抓HTTPS数据包(9分钟)
【录播】BurpSuite2.0抓WebSockets数据包(9分钟)
【录播】BurpSuite2.0-Intruder的4种攻击方式(16分钟)
【录播】BurpSuite2.0-18种PayloadType的实战(28分钟)
【录播】BurpSuite2.0-Repeater功能实战(6分钟)
【录播】BurpSuite2.0-Decoder功能实战(6分钟)
【录播】BurpSuite2.0-Comparer(6分钟)
【录播】BurpSuite2.0-插件使用实战(11分钟)
06、SQL注入漏洞疑惑扫除
【录播】【理论】SQL注入的业务场景以及危害(17分钟)
【录播】【实验】真实网站中的SQL注入是怎么样的(8分钟)
【录播】【理论】SQL为什么有那么多分类(11分钟)
【录播】【实验】SQL注入实验环境搭建(7分钟)
07、SQL注入理论与实战精讲
【录播】【实验】整型注入(37分钟)
【录播】【实验】字符型注入(单引号 双引号 括号)(23分钟)
【录播】【实验】POST注入(18分钟)
【录播】【实验】报错注入(14分钟)
【录播】【实验】双注入(34分钟)
【录播】【实验】布尔注入(37分钟)
【录播】【实验】时间盲注(14分钟)
【录播】【实验】Cookie注入(13分钟)
【录播】【实验】Referer注入(13分钟)
【录播】【实验】SQL注入读写文件(18分钟)
08、SQL注入绕过技巧
【录播】【实验】绕过注释符过滤(12分钟)
【录播】【实验】绕过and/or字符过滤(13分钟)
【录播】【实验】绕过空格过滤(6分钟)
【录播】【实验】内联注释绕过(15分钟)
【录播】【实验】过滤函数绕过(41分钟)
【录播】【实验】宽字节注入(10分钟)
09、SQL注入防御
【录播】【理论】SQL注入防御(9分钟)
10、文件上传漏洞-初级
【录播】文件上传/下载漏洞的业务场景以及危害(31分钟)
【录播】前台JS验证审计+绕过(31分钟)
【录播】content-type验证审计+绕过(9分钟)
【录播】phtml绕过+代码审计(12分钟)
【录播】覆盖.htaccess绕过+代码审计(12分钟)
【录播】大小写绕过+代码审计(6分钟)
【录播】后缀加空格绕过+代码审计(5分钟)
11、文件上传漏洞-中级
【录播】后缀加点绕过+代码审计(4分钟)
【录播】后缀加::$DATA绕过+代码审计(5分钟)
【录播】后缀. .绕过+代码审计(4分钟)
【录播】双写绕过+代码审计(8分钟)
【录播】GET00截断绕过+代码审计(13分钟)
【录播】POST00截断绕过+代码审计(7分钟)
【录播】图片马绕过+代码审计(18分钟)
12、文件上传漏洞-高级
【录播】图片马绕过+另类代码审计(7分钟)
【录播】exif_imagetype绕过+另类代码审计(8分钟)
【录播】图像二次渲染绕过+另类代码审计(14分钟)
【录播】条件竞争绕过+另类代码审计(27分钟)
【录播】条件竞争加解析漏洞绕过+另类代码审计(13分钟)
【录播】00截断漏洞绕过+另类代码审计(6分钟)
【录播】数组配合windows特性绕过+代码审计(15分钟)
13、文件包含漏洞理论
【录播】文件包含漏洞产生的原因(16分钟)
【录播】文件包含漏洞利用方式(16分钟)
【录播】文件包含漏洞的防御(4分钟)
14、文件包含漏洞绕过方法
【录播】简单文件包含(14分钟)
【录播】文件包含00阶段绕过(10分钟)
【录播】点加斜杠绕过(15分钟)
【录播】去掉后缀名绕过(10分钟)
【录播】双写绕过(9分钟)
【录播】文件包含写shell(8分钟)
【录播】文件包含小总结(8分钟)
【录播】包含日志文件获取WebShell(11分钟)
15、PHP伪协议实战
【录播】通过php_filter获取flag(13分钟)
【录播】php_input命令执行及获取webshell(11分钟)
【录播】php压缩协议获取webshell(10分钟)
【录播】php-data协议获取webshell(6分钟)
【录播】利用操作系统特性进行文件包含(6分钟)
16、XSS跨站脚本漏洞原理/危害
【录播】【理论】XSS漏洞原理介绍(9分钟)
【录播】【理论】XSS漏洞分类介绍及应用(22分钟)
【录播】【理论】XSS利用方式及应用(29分钟)
【录播】【实验】深入了解XSS漏洞的三个分类(41分钟)
17、XSS平台使用
【录播】【实验】XSS平台-开源项目(45分钟)
【录播】【实验】XSS平台-BEEF(47分钟)
18、XSS代码审计及绕过(一)
【录播】【实验】XSS漏洞环境说明(8分钟)
【录播】【实验】XSS绕过初体验(9分钟)
【录播】【实验】XSS事件触发绕过(8分钟)
【录播】【实验】XSS语法逃逸(6分钟)
【录播】【实验】XSS白名单绕过(7分钟)
【录播】【实验】HREF属性绕过(7分钟)
【录播】【实验】XSS双写绕过(6分钟)
【录播】【实验】HTML实体编码绕过(13分钟)
【录播】【实验】特殊场景绕过(6分钟)
【录播】【实验】利用隐藏字段绕过(7分钟)
19、XSS代码审计及绕过(二)
【录播】【实验】HTTP头部XSS(22分钟)
【录播】【实验】Angularjs绕过(8分钟)
【录播】【实验】利用HTML语法特性绕过(6分钟)
【录播】【实验】可控变量绕过(4分钟)
【录播】【实验】XSS绕过测验一(28分钟)
【录播】【实验】XSS绕过测验二(11分钟)
20、XSS漏洞防御
【录播】【实验】XSS漏洞防御(15分钟)
21、CSRF跨站请求伪造漏洞原理及代码审计
【录播】【理论】CSRF原理及防御(16分钟)
【录播】【实验】CSRF漏洞初体验+代码审计(11分钟)
【录播】【实验】CSRF-referer检测绕过代码审计(8分钟)
【录播】【实验】靶场实操igaming-CSRF漏洞审计利用(11分钟)
【录播】【实验】靶场实操ESPCMS-CSRF漏洞(4分钟)
22、SSRF漏洞基础知识
【录播】SSRF课程介绍(18分钟)
【录播】SSRF漏洞原理深入解析(36分钟)
【录播】课程环境搭建(36分钟)
【录播】SSRF漏洞基础理论实验(12分钟)
23、Gopher协议在SSRF漏洞中的深入研究
【录播】使用Gopher协议发送Get请求(23分钟)
【录播】使用Gopher协议发送Post请求(10分钟)
【录播】Gopher协议渗透Java的Struts2框架(5分钟)
【录播】在SSRF中如何使gopher协议渗透Redis(26分钟)
24、SSRF漏洞渗透Redis-从零到获取Shell
【录播】SSRF漏洞渗透Redis-获取shell(43分钟)
【录播】Attack Redis认证(20分钟)
【录播】利用Redis漏洞写入SSH公钥获取服务器权限(14分钟)
【录播】利用Redis备份功能写webshell(4分钟)
【录播】SSRF漏洞中使用到的其他协议(26分钟)
25、SSRF漏洞绕过及加固
【录播】SSRF漏洞绕过方法(6分钟)
【录播】SSRF漏洞加固(5分钟)
26、AWVS漏洞扫描实战
【录播】AWVS的简单介绍(10分钟)
【录播】AWVS在Kali2.0的安装方法(16分钟)
【录播】详解自动化漏洞扫描器-AWVS(51分钟)
【录播】AWVS的探针式扫描(Sensor)(16分钟)
【录播】使用AWVS-API打造自动化漏洞扫描器(38分钟)
27、WebShell管理工具介绍
【录播】Web后门管理工具(29分钟)
28、菜刀工具使用
【录播】菜刀配合MSF进行提权-理论(6分钟)
【录播】菜刀配合MSF进行提权-环境搭建(12分钟)
【录播】菜刀配合MSF进行提权-试验(32分钟)
【录播】使用菜刀进行数据库提权(23分钟)
【录播】菜刀的小知识总结(7分钟)
29、冰蝎3.0工具使用
【录播】冰蝎使用环境搭建(15分钟)
【录播】冰蝎反弹操作系统shell(28分钟)
【录播】冰蝎VPS内网渗透-端口转发(27分钟)
【录播】冰蝎内网渗透-Socks5代理打穿内网(30分钟)
【录播】冰蝎内网渗透-冰蝎自带的Socks代理使用(11分钟)
30、SQLServer安全
【录播】SQLServer安全(上)(16分钟)
【录播】SQLServer安全(中)(16分钟)
【录播】SQLServer安全(下)(24分钟)
【录播】通过xp_cmdshell获取服务器最高权限(15分钟)
【录播】通过sp_oacreate获取服务器最高权限(9分钟)
【录播】通过沙盒提权获取服务器最高权限(6分钟)
31、MySQL安全
【录播】MySQL安全(29分钟)
【录播】通过MySQL-UDF获取服务器最高权限(20分钟)
32、Oracle安全
【录播】Oracle安全(18分钟)
33、Redis安全
【录播】Redis安全(12分钟)
【录播】通过Redis获取服务器最高权限(8分钟)
34、Windows系统安全
【录播】Windows账户及安全策略概述(16分钟)
【录播】Windows访问控制(9分钟)
【录播】Windows系统安全配置及用户账户管理(26分钟)
【录播】Windows文件系统安全(18分钟)
【录播】Windows日志分析(4分钟)
35、Linux系统安全
【录播】用户组概念(32分钟)
【录播】账户风险和安全策略(31分钟)
【录播】Linux文件系统安全(11分钟)
【录播】日志分析(13分钟)
如何快速精通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用于测试一个数组的值在另一个数组的情况。
如何写一封好的外贸开发信?
说说几个重要的原则:
1. 首先,重要的事情说三遍:
找准目标客户再写!找准目标客户再写!找准目标客户再写!
因为,如果这个客户不做你的产品,或者规模太小只在当地采购,或者只是完全是另一个行业的,那么你一天发出去200封开发信,也全部是无效的。目标客户正确了,开发信给对了人,即使你只发一封邮件,这一封的有效率是100%。举个例子,我的第一个外贸客户,是我实习的时候遇到的,初入职场的嫩草,完全不知道怎么开始,但是认准了一点,就是不做无用功。我搜到这个客户,先查了一下公司网站,确定是做这个产品的,再根据领英等平台判断客户规模,判断他有进口需要后,才开始开发这个客户。我的一个同事,每天发200多封开发信,初入外贸的我羡慕得很,觉得人家的工作效率真高啊!结果呢,我第二天收到这个客户的回复,同事一个月没有收到一封回复,反而被垃圾邮件占满了,因为她发的全是各种能看到的邮箱,比如xxx采购名录,邮箱那头是谁,完全不知道,也不知道这个邮箱是不是骗子留下的。
2,一定要发对人。也就是说,确定这个公司是目标客户后,那就要开始找对人。我们都知道国外客户不喜欢留下采购部的联系方式,就是怕大家打扰他啊!但是我们不打扰他,怎么能把产品推销给他呢? 所以还是要想方设法地烦扰他啊!如果你发的邮箱对应的是叉车司机、财务主任、生产工人。。。你想,他看到邮件会不会直接无视呢?情况好的,会帮你转发,或者告诉你他不负责;但是,99%以上的人,会无视或者删除,哪怕你让他给你负责人联系方式,他也不敢,也不想啊。所以,你要自己找。具体方法先不说,以后再详谈,因为方法太多了。
3,标题不要写敏感词汇。举个例子,做LED灯的,采购经理真的每天收到几十封上百封邮件,而且”LED”标题的太多了,看到你是陌生人,很多会选择“未读删除”。建议直接列举出来优势,比如你们产品的独家优势是xxx,那就直接在标题里面写出来。很多人建议你用当地的大品牌做标题,代表你们给大品牌供货了。我试过,的确很多回复你的,然后结果就是客户会一再确认你们是不是供过货给大品牌,如果是,在哪里,他要去看,刨根问底。。。因为他就是被这个吸引来的。而且这样做的另一个隐患是:绝大部分客户不希望自己在哪家供应商拿货被别人知道,明目张胆地大量开发,他会认为你将来也会打着他的旗号去开发别人,第一印象真的很重要。
4,要有针对性。也就是说,千篇一律的模板不适合所有客户,尤其一些特殊客户,比如你的竞争对手的客户。举个例子:我通过海关数据发现竞争对手的客户,这封开发信的重点就是:直接表明我们的产品不存在xx问题,这个问题当然就是你的竞争对手的问题。再举个例子,我的一个客户,通通过研究网站发现他的产品存在一个缺陷,开发信里就直接说:我发现你的产品....当然,不要说这是严重的问题,而要说我们有更好的解决方式,我们的产品这方面性能更好...etc。 越是重要客户,越是要区别对待。
5,连贯性。意思是,不要一遍一遍、一轮一轮地发同一封开发信,发几次就被拉黑了。很多新手看到客户不回复,那就再次复制粘贴,再发一次,结果肯定是拉黑,不拉黑留着过年吗?只要你确定你开发的是对的人,那么就要连续性的开发他。举个例子,第一封开发信是开门见山地介绍产品,或者确认他的需求;第二封就要不重样,发个产品优势表,来个小视频展示性能等。再不回复,打电话确认下,的确是有需求的,那就继续吧,一般是会被你吸引住的。
6,最基本的:字体不要花里胡哨、格式不要乱七八糟、签名不要五颜六色、链接不要到处都是、附件不要太大、内容不要太冗杂。这些是基本的注意事项,学好了再进行下一步。
暂时想到的是这些,后期想到的会再更新。
你们有什么好的想法呢?有没有新的技巧可以分享的?欢迎留言,大家一起学习,一起成长。
<我是“小G外贸源”,欢迎关注我。有问题可以留言,我会及时回复的>
怎么自学数据分析?
不管是运营APP,还是运营微信公众号,头号号,大鱼号,还是百家号,新媒体数据不仅是数据工程师和分析师的事情,在工作中也要求运营从业者有一定的数据分析能力。
新媒体数据分析
公子义认为数据是优化新媒体运营关键所在,能更好推动运营策略和工作的开展。
但运营童鞋多是数据小白,没有编程和技术基础,该怎么分析并用好数据呢?
今天从运营常见的数据问题出发,希望让大家能快速地入门数据分析,让数据更好地为工作服务,别白白浪费数据的价值。
一、数据分析应该从哪里入手?
从哪些角度入手?这是运营小伙伴们最头痛的问题,不知道该关注、分析哪些数据,就算拿到数据后,也不知道到底从哪些方面去分析这些运营数据。
新媒体数据分析
公子义给小伙伴们整理一些运营常见的数据指标,也总结了一些比较适用的分析角度,希望有用~
1、新媒体运营关注的常见数据指标
1)访问:PV、UV、IP(最常见);跳出率、平均访问时长、平均访问页数等;
2)注册:关注人数、关注走势、累计关注人数、转化率等;
用户
1)活跃:内容PV、UV;UGC、PGC、文章数、关注数、阅读数、互动数(评论、点赞等)、传播数(转发、分享等);
用户喜好文章的类型
2)互动人数:每日评论人数、收藏人数、分享人数等
3)头像:分析用户属性,关注年龄、性别、学历、职业、地域、婚否、收入、兴趣等;
2、新媒体运营数据分析要遵循哪些原则?
但是运营毕竟不是专业的数据分析师,主要能用好这些原则就够了~
对比:分成横向和纵向对比,比如纵向的同环比分析,横向的不同产品、不同渠道的对比等;
走势(变化):指标随时间的变动,表现为增幅(同比、环比等);
分布:这个好理解,比如说用户不同年龄段的分类、不同职业的分布、不同地域分布等;
用户地域分布图
细分:从多层级去了解数据,比如分析全国不同省份不同城市的具体订单数据,从全国—省份—城市一一下钻深入分析;
如何变身自己的“专属分析师”呢~数据分析的整个过程:确定指标——数据收集——数据整合、数据处理/建模、数据分析、数据呈现、报表整理
数据收集:可通过公司数据库埋点获得,可以通过头条号、微信公众号、大鱼号、百家号等媒体平台获得,也通过一些记录的数据获得。
数据整合:运营人要看的数据太多了,有数据库,有各种第三平台的数据(新榜、清博指数、公众号等),每次都需要从不同平台取数据,太分散了,最好能在一个数据平台集中管理数据。
爆款文章数据分析
数据分析:可参考分析方法,比如“求和、计数、同环比、多粒度下钻”等分析,一般在Excel中需通过写公式搞定。
数据呈现(可视化):
简单地说,就是如何制图呗,报表汇报:将数据通过表格、图表或其他形式向领导汇报。如何不依赖分析师,自己搞定数据分析呢?
1、学习一些数据分析理论。(数据思维)
2、了解、熟悉业务,这点很重要。(业务思路)
3、学习一些数据分析工具。(工具辅助)以我的个人经验来看,真正把握这些真真是够了
二、如何制作让老板满意的好看图表?
没有哪个老板喜欢杂乱的表格数据,颜值才是王道啊。简单地说,就是数据如何可视化,让数据直观、明了。
分析数据占比:分析单维度的数据占比可用饼/环图、分析多维度的数据占比,可用旭日图和矩形树图。
分析数据走线图:最常用的是折线图,柱状图也可以表达,直观度略低于折线图。分析地区分布:全国、省份分布可用行政地图,更详细的地域分布可用经纬。
用户分析词频
分析词频:比如用户的职位分布,可用词云,有3D效果哦~分析转化效果:那肯定用漏斗图最最合适。
关于转化,分享一个自己身边的真实故事。每个图表都有适合的使用场景,用好各种图表很重要,直接影响到数据的直观和美观程度。
三、如何快速找到数据背后的问题?
做了那么多的数据工作,最终无非是为了从数据中去发现问题,不断优化运营策略。
不论数据是上升了还是下降了,肯定有其变化的原因,这里以用户数据变化为例了解一下快速找到问题的思路。
看数据—发现问题—解决问题—再看数据—问题解决,或者看数据—发现增长—找到原因—继续应用。
作者 l 公子义
来源 l 公子义(ID:gongzi348)