python由来



它的创造者:

Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。

我所理解的python

首先,它是一门计算机语言,用于人与计算机之间的交流。
           利用代码控制机器,从而达到与机器之间进行交流。
           机器不能够直接识别python语言,代码首先由人类写出来,然后通过解释器翻译给机器,然后机器开始执行命令,并通过解释器将结果传达给我们。

python历史
         1989年被Guido van Rossum创造出来
         到2008年python3.0诞生,与python2.0(老标准)完全不同,抛弃了旧有的东西
         2014年宣布2.7能够支持到2020年
         起初是搞运维开发的发现python适合作为运维脚本,在此之前使用的是shell(老男孩,靠python运维起家)
         大数据崛起
         R语言  选择python语言,全能语言
        2017年,也就是去年,AI元年,python崛起
        C++ Java不够简洁

python特点


速度比Java慢20倍
但是python应用在对速度不要求的领域
数据分析 人工智能(不差时间)
开发速度特别快
python成为大牛,有机会

python应用领域
全能,没有主打领域,样样通
优雅,设计哲学,简洁明了

环境anaconda+pycharm
python3.6


jupyter笔记本的使用


启动原理
  终端真正干活,属于解释器,求助于浏览器,通过浏览器将人类输入的东西输入并执行,然后将结果很清楚地展示给人类
下载并安装anaconda
选择使用jupyter笔记本
利用new新建一个笔记本(help中有快捷键)

好处:


做笔记的同时敲代码

python


是命令的集合体,执行的时候是一条一条执行,遇到问题就终止(这也是它为什么慢的原因)
逐行执行,读一条执行一条

alt+enter执行代码
打印出hello world
print("hello world")

syntaxerror 语法错误

注释
      机器不去执行注释内容
      注释一般用自然语言书写


注释的写法:


      行注释: 以井号开头,可以单独行,也可以在某行代码后边
      块注释: 好几行代码或者内容,以三个连续单引号或双引号开始和结束,                    
  中间任何内容机器都忽略

变量

重复使用的一个量或一个代号

变量命名规则


变量名可以包含数字,大小写字母,下划线或(更多,但是我们不推荐)
1,数字不可以开头,
2,以下划线开头有特殊含义
3,大小写不一样,俗称大小写敏感
推荐写法:
固定含义的英文单词和缩写,一般以posix命名规则为主
驼峰命名法
大驼峰,每个单词第一个字母大写,类的命名
MyGril
小驼峰
类似大驼峰第一个字母小写,普通变量或者函数名
myGril
posix写法
多个单词之间    用下划线链接,单词全部小写
my_gril


保留字和关键字

变量命名必须避开,不能跟关键字和保留字重复,系统自己实用的
class, def, break,for
查看关键字保留字
实际上关键字和保留字是不一样的
import keyword
print(keyword.kwlist)

变量声明
var_name=var_value
等号表示赋值
双等号表示相等
从右到左

var=var2=var3=value
var5,var6,var7=value1,value2,value3    //java中不能这样赋值

赋值实例
1.age=18
2.age=age1=age2=18
3.age4,age5,age6=4,5,6

 

变量类型

严格意义上python只有一种


标准数据一共有六种
1.数字类型Number
2.字符串类型str
3.列表list
4.元组tuple
5.字典dictionry
6.集合set

数字类型

数字类型没有大小限制
整数
分进制
二(机器唯一认识)0b开头,0b0001
,八0o开头
,十六0x开头,其实是四位二进制表示一个十六进制
以及十

浮点数
小数
计算机中表示小数可以有条件省略
3.1415
3.
0.5
.5
可以偷懒

科学计数法

定义跟数学定义
写法是用e/E后面跟整数表示10的指数
176.23 == 1.7634e2
0.876 == 8.76e-1

在python特殊的东西
复数
5+4j与数学中表示一致

布尔值
表示真或者假
True表示1     False表示0

字符串

用来表示一串文字
单引号
双引号
三引号(能够扩起多行信息)
作用基本一致
区别:单双引号可以交错使用,防止多引号时误认,因为每一个单/双引号都直接认识最接近它的那个引号


转义字符
用一个特殊的方法表示出一系列不方便写出的内容,比如回车键,换行键,退格键
借助反斜杠字符,一旦字符串中出现反斜杠,则反斜杠后面一个或几个字符表示已经不是原来的意思了,进行了转义
在字符串中,一旦出现反斜杠就要加倍小心,可能由转义字符出现
不同系统对换行操作有不同的表示
windows: \n
Linux: \r\n

字符串的格式化
把字符串按照一定的格式打印或者填充
格式化有两种方法
1.用%
2.format函数
%d表示应该放入一个整数
%s表示应该放入一个字符串
print(“{0}xxxxx”.format(参数))


None
表示什么都没有
如果函数没有返回值,用于返回值
用来占位置
用来解除变量绑定

表达式
由一个数字或者几个或者变量和运算符组称的一行代码
通常会返回一个结果

运算符
分类:
算数运算符
关系(比较)运算符
赋值运算符
位运算
成员运算
身份运算
逻辑运算符


算数运算符


%取余运算
//取商运算
**表示次方
9**4代表9的四次方        

python没有自增自减运算

比较运算
比较的结果是布尔值

== < >>= <=   !=

赋值运算符
a+=7----a=a+7

逻辑运算符
对布尔值进行的运算
and   看做乘法 逻辑与
or  看做加法 逻辑或
  not  逻辑非

逻辑运算的短路问题

逻辑运算式,按照运算顺序计算,一旦能够确定整个式子未来的值,则不再进行计算,直接返回

成员运算符
用来检验一个变量是否属于另一个变量的成员
in
not in

身份运算 
用来检验两个变量是否为同一个变量
is
is not


运算符的优先级
括号具有最高的优先级    
优先级表格
  **  指数 (最高优先级)
  ~ + -   按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
  * / % //    乘,除,取模和取整除
  + - 加法减法
  >> <<   右移,左移运算符
  &   位 'AND'
  ^ | 位运算符
  <= < > >=   比较运算符
  <> == !=    等于运算符
  = %= /= //= -= += *= **=    赋值运算符
  is is not   身份运算符
  in not in   成员运算符
  not or and  逻辑运算符


程序结构
顺序
分支
循环

分支

if 条件表达式: (空格要有,冒号要有,用缩进表示一个块)
   语句1
   语句2
   语句3    
       ........

       条件表达式的结果必须是一个布尔值

双向分支
if 条件表达式:
    语句1
    语句2
    语句3
    .......
else:
    语句1
    语句2
    语句3

   .....
双向分支中一定会执行一个 if或者else
if 和else一个层级,其他的一个层级
语句块中的缩进必须一样indent(缩进)

       字符串类型要和数字比大小,要先转化为数字类型

多路分支
冷读术
if 条件表达式:
    语句1
    .......
elif 条件表达式:
    语句1
    ......
elif 条件表达式:
    语句1
    .........
    只会选择一个执行

    
  if语句可以嵌套使用

循环语句

for循环
for 变量 in 序列:
   语句1
   语句2
   .....
   列表就是一列数字或者其它值,一般用中括号表示
l={“张三”,“李四”,“老王”}
  for i in l:
     print(i)

     
range
生成一个数字序列,具体范围可以设定
for i in range(1,10):
       print(i)

for  else 语句
当for循环结束之后,会执行else语句
else语句是可选语句
for 变量 in 序列:
     语句1
     ...
else:
    语句

循环之break,continue,pass
break 无条件结束整个循环,循环猝死
continue无条件结束本次循环,从新进入下一轮循环
pass表示略过,一般用于占位
在数字1-10中,寻找数字7,一旦找到,打印出来,其余则什么都不做
for 循环中的变量表示,一般用i,k,m,n,或者indx,idx,item之类
在python中,如果循环变量名称不重要,可以用下划线(_)代替


while循环     
当某条件成立的时候就是循环,不知道具体的循环次数
while 条件表达式:
     语句块
只要条件表达式是真,就开始循环

函数
代码的一种组织形式
一个函数一般完成一种特殊的功能
函数需要先定义,然后调用

def(关键字) 函数名称():

定义一个函数

#只是定义的话不会执行
#1. def关键字,后跟一个空格
#2. 函数名,自己定义,起名需要遵循便令命名规则,约定俗成,大驼峰命名只给类用
 3. 后面括号和冒号不能省,括号内可以由参数
 4. 函数内所有代码缩进

函数的参数和返回值
形参:在函数定义的时候形参没有具体的数值,相当于一个占位符
实参:在调用函数的时候输入的值
返回值
函数执行的结果
使用return    关键字
如果没有return则默认返回None
函数一旦执行return,则无条件返回,就结束整个函数

help函数

在print中,end代表在print执行结束时需要进行的动作,print默认为是换行,这里可以做修改。(end=" ")

参数分类
  普通参数
      定义的时候直接定义变量名
调用的时候直接把变量或者值放入指定位置
            def 函数名(参数1, 参数2,....):
                函数体

            # 调用
            函数名(value1, value2,.......)

            # 调用的时候,具体值参考的是位置,按位置赋值
            
  默认参数
     形参带有默认值
调用的时候,如果没有对相应形参赋值,则使用默认值
      def  func_name(p1=v1, p2=v2..........):
          func_block

      #调用1
      func_name()

      # 调用2
      value1= 100
      value2=200
      func_name(value1,value2)

      
  关键字参数
语法
def func (p1=v1,p2=v2........)
    func_body
调用函数:
    func(p1=value1, p2=value2,.....)
  比较麻烦,但是很好用
  不容易混淆,普通参数按照位置的顺序进行传递,容易出错。使用关键字参数,不用考虑参数位置

  收集参数
参数在里面属于一个list格式。
收集参数之关键字收集参数——把关键字按字典格式存入收集参数中
语法:
  def func(**kwargs):
      func_body
   调用:
   func(p1=v1,p2=v2,p3=v3........)
   收集参数可以为空
   收集参数混合调用的顺序问题
   收集参数,关键字参数,普通参数可以混合使用
   普通参数和关键字参数优先
   普通参数-关键字参数-收集参数tuple-收集参数dict

  
收集参数的解包问题
把参数放入list或者字典中,直接把list值放入收集参数中
stu(*(list名称))**用来解包

返回值
用return表示,若果没有,则默认返回None

函数文档
函数文档的作用是对当前函数提供使用相关的参考信息
文档的写法:
在函数内部开始的第一行,用三引号字符串定义符
一般具有特定格式
文档查看
使用help函数,help(函数名)
函数名__doc__

变量作用域

    变量由作用范围限制
   分类:按照作用域分类
   全局(global): 在函数外部定义
   局部(local):在函数内部定义
   变量的作用范围:
   全局变量:在整个全局范围都有效
全局变量在局部可以使用(即函数内部可以方位函数外部定义的变量)
局部变量在局部范围可以使用
局部变量在全局范围无法使用
LEGB原则
L(Local)局部作用域
E(Enclosing function locale)外部嵌套函数作用域
G(Global module)函数定义所在模块作用域
B(Buildin): python内置魔抗的作用域
**全局变量的数值不能够在局部改变

提升局部变量为全局变量
使用global

可以使用globals locals显示出局部变量和全局变量
结果会以字典形式呈现

eval函数
将一个字符串按照一个表达式来执行,然后将结果返回

exec函数
功能与eval差不多,,但是不返回结果

递归函数
特点:函数调用自己
优点:简洁,理解容易
缺点:对递归深度有限制,消耗资源大

python对递归深度有限制,超过限制报错   || java中也有
注意:在写递归程序的时候,一定注意结束条件


一个函数的函数返回值只能有一个,且后面不能够覆盖
应用:斐波那契额数列
def fib(n):
    if n == 1:
        return 1
        
    if n == 2:
        return 1 
    return fib(n-1) + fib(n-2)

内置数据结构
list
set
dict
tuple
一组有顺序的数据组成
l=[1,2,3,4]
l=list()

***其中list可以转变为tuple,tuple也可以转变为list,但是两者不能转为dict,dict转化为tuple和list是只能将K表示出来。

下标负数
左边的值一定小于右边
l=[1,2,3,4,5,7,8]
                   -2-1
     0,1,2

通过下标可以更改列表中该下标的值
利用del可以进行删除操作,进行删除操作后,并没有生成一个新的列表
删除一个变量后,此变量不能够再次使用

分片操作是生成一个新的list

分片操作会生成新的地址

内置函数id,负责显示一个变量或者数据的唯一确定编号
l=[1:4]表示将从1到3的数据显示出来
l=[:4]左边不写表示从0开始
右边不写代表到最后一个数终止
l=[1:4:2]表示隔一个抽取

ID操作
a=3
c=a此时两个变量ID相同,即都指向同一个数据
但是如果更改c的值
此刻a的值不会发生变化

解释:
那么看似牛X的Python变量是如何可以切换类型的呢,其实真正牛的不是Python变量,而是Python语言的解释执行器。

举个例子如下,解释器可以这么运作。首先在内存中地址为XXXX的地方存了一个变量1,然后运行到a=1时,发现整数1要赋值给变量a,所以解释器就知道了啊哈变量a是整型,然后a其实保存的是地址XXXX。
然后运行到a=0.1,解释执行器在内存中地址为YYYY的地方存了0.1,然后知道了啊哈a是浮点类型,然后a保存的地址变为了YYYY

    
内置数据结构
汉诺塔问题
规则:
每次移动一个盘子
任何时候大盘子在下面,小盘子在上面
方法:
n=1: 直接把A上的一个盘子移动到C上, A->C
n=2:
把小盘子从A放到B上, A->B
把大盘子从A放到C上, A->C
把小盘子从B放到C上, B->C
n=3:
把A上的两个盘子,通过C移动到B上去, 调用递归实现
把A上剩下的一个最大盘子移动到C上, A->C
把B上两个盘子,借助于A,挪到C上去, 调用递归
n = n:
把A上的n-1个盘子,借助于C,移动到B上去,调用递归
把A上的最大盘子,也是唯一一个,移动到C上,A->C
把B上n-1个盘子,借助于A,移动到C上, 调用递归

使用加号连接两个列表
使用乘号操作列表
列表直接跟一个整数相乘 
相当于把n个列表接在一起

成员资格运算,利用 b in l ,就是查看b是否在l内

not in   返回结果是一个布尔值

列表能被进行遍历

双层列表,也叫做列表嵌套
index表示list的下标
l=[["a",1,3],["b",2,4]]
访问
for k,v,w in l:
print(k,v,w)

创建一个列表
l=[1,6,8,9]
s=[i for i in l]

如果要使l中的数据都扩大十倍,那么可以这样:
s=[i*10 for i in l]

列表生成可以嵌套

列表生成中可以使用条件表达式格式
s=[m+n for n in l for m in s if m+n<100]

列表的常用函数

max min len list 

传值和传地址的区别
 对于简单的数值,采用传值操作,即在函数内对参数的操作不影响外面的变量
 对于复杂变量,采用传地址操作,此时函数内的参数和外部变量是同一份内容,
 任何地方对此内容的更改都影响另外的变量或参数的使用

append表示插入一个内容在末尾追加
l.append()
insert 指定位置插入
l.insert(位置下标,数值)
pop拿出最后一个元素
remove移除指定值的元素,是在原list上操作,不是新生成一个地址
clear清空列表
a.clear()
reverse翻转列表
a.reverse()
extend扩展列表,把一个直接拼接到另一个上
a.extend()
count查找指定值或元素的个数
a.count(数值)
copy是一个浅拷贝函数
b=[1,2,3]
c=b.copy()
其中b[1]和c[1]的地址相同,尽管b和c的地址不同
浅拷贝和深拷贝
作用,解决list类型简单赋值操作是传地址的问题

元组数值可以访问,但是不能够修改,可以是任意类型,除了不能修改,其它与list一样(索引,分片,相乘,序列相加,成员资格等)
访问不能够超标,但是切片可以


元组
index元素索引位置
index(数值)

集合set
一堆确定的无序的数据,集合中每一个数据成为一个元素
集合的定义
s=set()
print(type(s))
s={1,2,3,4}
集合没有索引,分片,数据具有唯一性可以用来排重
如果只用一个大括号,那么定义的是一个字典
集合内部只能存放可哈希数据
集合无序性
集合本身不可哈希

集合的内涵
初始化后自动过滤重复值    
集合中添加函数用add,因为本身没有顺序,不需要用append和insert
clear是原地清空
remove和discard区别
pop随机移除一个元素(但是据我观察好像是删除最小的)

集合的函数
intersection交集
different 差集
union并集
issubset检查一个集合是否为另一个集合的子集
issuperset超集

集合数学操作
直接减,差集

frozen     set冰冻集合,不能修改的集合
s=frozenset()

字典
一组组合数据,没有顺序,数据以键值对出现
创建
f={}
键值对
f={“a”:1,"b":,"c":3}
利用关键字参数
f=(a=1,b=2,c=3)
f=([("a",1),("b",2)])

成员检测的是Key

字典中比较特殊的函数
str()返回字典字符串格式

items函数返回字典的键值对元组格式,可迭代
key 返回键值组称的结构

get指定值返回,好处是可以设置默认值

fromkeys使用一个序列作为键,选择一个数据为所有键赋值


 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐