我是一个前程序员,学过了JavaScript,HTML,CSS。
下面再学习和总结蟒蛇的过程中基本的语法等地方难免会忍不住的会和JS进行对比。
有不对的地方还望指出来,谢谢
一,字符串
- 声明格式:str =“这是一个字符串......”
- 声明的字符串可以用单引号,双引号和三个单引号的方式括起来
例如:str1 ='单引号括起来的字符串'
str2 =“双引号括起来的字符串”
str3 ='''
这是
三个单引号
括起来的字符串
“””
- 在字符串中也可以同时出现两种引号 - “”....'...'......“,主要就是为了实现在字符串中本身就需要的引号,防止代码报错
- 字符串的格式化
一个利用百分号格式化:
str =“我是%s”
打印(%s“weiY”)=>“我是weiY”
湾利用格式格式化
str =“我是{0},来自{1}”。format('weiY','浙江杭州')
print(str)=>“我是weiY,来自浙江杭州”
字符串中有几个需要格式化,就在格式函数中写几个字符,对应位置
- 转义字符
在字符串中一般还会存在特殊字符,例如换行,空格等,但是这一类的特殊字符直接使用的话计算机读取不出来,所以蟒蛇和其他计算机语言就用准以字符代替此类字符。
在需要转义的字符前面加上\就行,例如:换行=“\ r \ n
二,无(注:开头Ñ需要大写,在JS中开头Ñ不需要大写)
语义:什么都没有
如果函数什么都不需要返回的时候,建议返回无(这是蟒大神的写法,那我就学习学习以后也这么写了)
无也可以用来占位,用来与变量绑定
三,表达式
就是由一个变量或者多个变量和运算符等组成的一行代码
四,运算符
1,算数运算符
+ =>加
- =>减
* =>乘
/ =>除
%=>取余(例:9%2 => 1)
// =>取商(例:9 // 2 => 4)
** =>幂运算(例:3 ** 4 => 81)
2,比较运算符(两个值相互比较,返回布尔值真/假)
==
!=
>
<
> =
<=
3,赋值运算符
=
a + = 7(简写)=> a = a +7
- =
* =
/ =
%=
// =
** =
如图4所示,逻辑运算符
和=>与
或=>或
不=>非
逻辑运算规则转换:
并且可以当作乘法计算,或者可以当作加法计算
真正看作1,假看作0
按照以上两句话的转换的话,整个逻辑运算公式就可以当作时整数的运算公式运算就行了,得到的结果为0就是假,为1就是真
例:
a =真
b =假
c =真
d = a或b和c(转换成:1 + 0 * 1 = 1)
得到的结果为1,那么d的值就是1,1就等于True,则最后上面的运算结果就是真
#逻辑运算的短路案例
#下面的逻辑表达式,a的值一定是True,则运行到或的时候,整个表达式不在向下计算
a = True或xxxxxxxxxxx
#下面表达式,如果xxx中包含赋值表达式,则结果很难预期
#代码示例(伪代码)
b = 0
a = a或(b = 9)和6
#假定上面表达式如果没有语法错误
#则b最终的值应该是0而不是9
打印(b)中
打印(一)
5,成员运算符,返回布尔值
in =>什么在什么里面
不在=>什么不在什么里面
6,身份运算符,返回布尔值
是=>是
如图7所示,运算符的优先级问题
五,python和其他语言执行的顺序应该都是一样吧,都是从上倒下一行一行的执行代码,至少js也是这样执行的。
1,分支
如果条件表达式:
代码1
代码2
elif条件表达式:
代码3
代码4
其他:
代码5
代码6
“””
注:与如果判断与JS之间语法写法还是有很大的差别的
首先js是这样写if的:if(条件表达式){}用{}括起来一个需要在如果中使用的代码块
再一个js中elif的写法是:else if
还有在蟒中,没有开关的情况下语句
“”“”
2,用于循环
for变量in序列:
代码块...
范围(开始数字,结束数字):就是生成一个由数字组成的列表,列表的内容有开始数字逐个递增1一直到结束数字-1这个数字为止
换别的语句:
for变量in序列:
代码块...
其他:
代码快...
在对循环结束后再执行别的语句,emmm但是这样的写法总感觉别人之后执行的代码和不写别的直接在为后面写上代码一样的效果
break无条件退出整个循环
继续无条件跳过本次循环,从新下一轮循环
通过略过,起到占位效果
3,而循环
而条件表达式:
代码块...
同时,没有具体的循环次数,只有当开头的条件成立的时候才会开始循环,一直到条件不成立才会终止循环
六,函数
def funcName(data):--->声明一个函数,这个函数需要一个形参,名为data
代码块...
return结果---->当一个函数执行完的时候返回一个结果,不知道返回什么的时候就返回无,前面有提到
funcName('123')---->调用函数,传入一个'123'的实参
函数中的参数赋值分类:
如图1所示,普通参数:
def funcName(val1,val2):
代码块...
funcName(1,2)-------->调用赋值的时候只按照值的位置赋值:1 = val1,2 = val2
2,默认参数:
def funcName(val1,val2,val3 ='3'):
代码块...
funcName(1,2)---->对应的参数为:val1 = 1,val2 = 2,val3 = 3
funcName(1,2,4)---->对应的参数为:val1 = 1,val2 = 2,val3 = 4
注:当VAL3位置没有具体的实参输入的时候,函数就使用默认的参数,注意的点是这里还是遵循位置前后顺序
3,关键字参数:
def funcName(name ='Noname',age,addr):
代码快...
了funcName(年龄= 18,名称= 'weiY',ADDR = '浙江杭州')
funcName(age = 18,addr ='浙江杭州')----> name会使用默认参数
funcName(年龄= 18,'weiY',addr ='浙江杭州')---->代码会报错:使用关键字参数形式的时候,必须所有的形参都有参数的时候必须每个实参都写明对应的关键字,否则就会报错
这里的实参位置可以打乱,只要关键字信息和形参一直就好,同时还能和默认参数一起用。
4,收集参数
def funcName(* args):---->不一定要用args写,也可以用别的单词但是约定俗成那就用args写,一定要加*,这里的arge是tuple类型,是一个元组
代码块...
了funcName( 'AA', 'B-B', 'C-C', 'D-D')
了funcName( 'EE')
funcName()---->收集参数入参可以为空
5,收集参数与关键字参数混用:
def func(** kwargs):---->不一定要用kwargs写,也可以用别的单词但是约定俗成那就用kwargs写,一定要加**,这里的kwarge是dict类型,是一个字典
代码块...
func(name =“weiY”,age = 19,addr =“zjhz”)
如图6所示,收集参数混合调用的顺序问题:
普通参数和关键字参数优先
定义的时候一般找:普通参数,关键字参数,收集参数元组,收集参数字典
7,收集参数的解包问题:
元组解包:
def func(* args):
代码块...
list = ['1','2','3']
func(* list)---->实参列表前也必须加上*
字典解包:
def func(** kwargs):
代码块...
d = {name ='weiY',年龄= 18 ....}
FUNC(** d)
如图8所示,给函数写文档:
在函数的内部第一行用三个单引号括起来的文字就是文档了
查看文档的方法:
帮助(了funcName)
了funcName .__ doc__会给出
七,变量的作用域
- 变量有作用范围限制
- 分类:按照作用域分类
-
- 全局(global):在函数外部定义
- 局部(本地):在函数内部定义
- 变量的作用范围:
-
- 全局变量:在整个全局范围都有效
- 全局变量在局部可以使用(即函数内部可以方位函数外部定义的变量)
- 局部变量在局部范围可以使用
- 局部变量在全局范围无法使用
- LEGB原则
-
- L(本地)局部作用域
- E(Enclosing function locale)外部嵌套函数作用域
- G(全局模块)函数定义所在模块作用域
- B(Buildin):python内置魔抗的作用域
1,在蟒蛇中,可以将局部变量转换成全局变量
例:def func():
全球的
b = 100
打印(b)中
func()---->打印出:100
print(b)---->打印出:100,不会报错了
全局()可以得到所在作用域内的全局变量
当地人()可以得到所在作用域内的所有局部变量
2,EVAL()函数,和JS中的EVAL函数一样的作用,把一个字符串当作表达式来执行,返回表达式的结果
3,EXEC()函数,和EVAL()一样,只是不返回表达式的结果
4,递归函数:就是直接或间接的调用自己的函数叫递归函数
蟒蛇中的递归函数有次数限制,当调用自身达到一定的次数的时候蟒蛇就会自己终止执行代码了,而像JS的话就会无限制的执行下去重复重复的调用,一直到浏览器崩溃
再写递归函数的时候一定要考虑到函数必须有一个结束条件
两个递归经典例子:
一。斐波那契额数列
#一列数字,第一个值是1,第二个也是1,从第三个开始,每一个数字的值等于前两个数字出现的值的和,数学公式为:f(1)= 1, f(2)= 1,f(n)= f(n-1)+ f(n-2)
#例如:1,1,2,3,5,8,13 .........
#下面求斐波那契数列函数有一定问题,比如n一开始就是负数,如何修正
#n表示求第n个数子的斐波那契数列的值
def fib(n):
如果n == 1:
返回1
如果n == 2:
返回1
#思考:为什么后面return能够正确执行,而不用其他语句
返回fib(n-1)+ fib(n-2)
打印(FIB(3))
打印(FIB(10))
湾汉诺塔
- 规则:
-
- 每次移动一个盘子
- 任何时候大盘子在下面,小盘子在上面
- 方法:
-
- 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:
-
-
- 把甲上的n-1个个盘子,借助于C,移动到乙上去,调用递归
- 把甲上的最大盘子,也是唯一一个,移动到Ç上,A->Ç
- 把B上n-1个盘子,借助于A,移动到C上,调用递归
-
代码:
def hano(n,a,b,c):
“””
汉诺塔的递归实现
N:代表几个盘子
答:代表第一个塔,开始的塔
B:代表第二个塔,中间过渡的塔
c:代表第三个塔,目标塔
“””
如果n == 1:
打印(a,“ - >”,c)
返回无
“””
如果n == 2:
打印(a,“ - >”,b)
打印(a,“ - >”,c)
print(b,“ - >”,c)
返回无
“””
#把n-1个盘子,从a借借助于c塔,挪到b塔上去
hano(n-1,a,c,b)
打印(a,“ - >”,c)
#把n-1个盘子,从b塔,借助于a塔,挪到c塔上去
hano(n-1,b,a,c)
a =“A”
b =“B”
c =“C”
n = 1
hano(n,a,b,c)