------ 一篇文章讲通Python语法 -------

1.Python环境的搭建

1.1运行环境 Python的安装

找到官方网站

找到download for windows

最好把add勾上,以后用第三方库会用到

安装好后打开python.exe就可以写python代码了

1.2开发环境的安装 pycharm

找到pycharm官网,往下翻找到社区版

点击download

选择安装路径

等待安装即可

创建项目

右击新建(名字必须带后缀.py,否则没法运行)

点击运行,即可运行

2.基础语法(1)

2.1 什么是常量、表达式、变量

我们可以把python当成一个计算器,做一些运算

如上图 1+2-3和1+2*3就是两个表达式,他们返回的值就是表达式的运算结果

1、 2、 3就是字面常量,+ - * / 就是运算符

熟悉C的人都知道 2/3 这种在C返回的是0,但是在Python它会返回一个小数的值

eg.给定四个分数, 67.5, 89.0, 12.9, 32.2 , 编写代码, 求这四个分数的平均数.

print((67.5 + 89.0 + 12.9 + 32.2)/4)

有的时候我们计算可能要复杂一点,需要保存一下中间值,这时候就有了变量

eg、给定四个分数, 67.5, 89.0, 12.9, 32.2 , 编写代码, 求这四个分数的方差. PS: 方差的计算过程: 取每一项, 减去平均值, 计算平方, 再求和, 最后除以 (项数 - 1)

求他们的方差,所以我们需要变量来保存一下中间值

avg = (67.5 + 89.0 + 12.9 + 32.2) / 4
total = (67.5 - avg) ** 2 + (89.0 - avg) ** 2 + (12.9 - avg) ** 2 + (32.2-avg) ** 2
result = total / 3
print(result)

2.2 变量的类型

(1) 整数

和C不同,python的整数类型是无限大的没有范围

(2)浮点数

python里不分单精度和双精度,python的float基本就相当于c的双精度

ps:双精度相对于单精度就是开的内存多了,小数更精确

(3) 字符串

使用 ' ' 或者 " " 引起来的, 称为 字符串. 可以用来表示文本.

可以用len求字符串长度

字符串相加其实就是拼接操作

(4)布尔类型

 

布尔类型在以后进行逻辑操作时是很有用的

(5)其他

除了这些类型,我们还有list,dict,tuple等自定义类型,我们在后面会介绍

python的类型可以动态变化,和c和java都不一样。这也是个双刃剑

2.3 注释

(1) 注释行 使用 # 开头的行都是注释.

(2) 文档字符串 使用三引号引起来的称为 "文档字符串", 也可以视为是一种注释.

可以包含多行内容, 一般放在 文件/函数/类 的开头. """ 或者 ''' 均可 (等价).

2.4 输入和输出

输入输出最基本的方法就是控制台,Pycharm运行完下面的窗口就是控制台,window系统的cmd程序也是控制台

Python 使用 print 函数输出到控制台.

更多时候,我们希望字符串和变量混在一起输出,这时候我们只要在前面带一个f  后面跟着要输出的字符串,把变量内容放在{}里,就能完成混合输出,也就是格式化输出

python的输入是由 input函数完成的

input的返回值是字符串类型,如果想操作input输入的值要先进行类型转换

input函数的参数相当于你要提示用户的信息

由此可以发现,此处的+做的是字符串的拼接,并不是整数的运算

想进行整数的运算,我们需要把a和b 转换成整数类型

a = int(a)
b = int(b)

2.5 运算符

(1)算术运算符

     像+ - * / % ** // 都属于算术运算符

notice 1:

/分母不能为0 ,如果分母为0 会出现抛出异常

notice 2:

整数/整数 得到一个小数,不会发生截断

notice 3:

**相当于乘方,不仅能算整数次方,也可以算小数

notice 4:

//表示地板除,向下取整

(2)关系运算符

< >= == != 都是关系运算符,他们表示操作数的关系

如果关系符合,则表达式返回True

否则,返回False

关系运算符不仅可以操作整数和浮点数,还可以比较字符串

比较字符串时就比较字母的字典序大小,何为字典序?就是从第一个字母开始比较,如果首个字母相等,就比较第二个字母,字母如果越靠前越小

对于浮点数,不可直接用 == 判断相等

因为小数在计算机的存储是有误差的

可以看到0.1 + 0.2并不等于0.3,而是带了一个小尾巴

不只是python这样 主流语言都有这样的问题 这是IEE754的标准带来的问题

(3)逻辑运算符

and or not 都为逻辑运算符

and 的两个操作数都为真,才为真,一个为假,就为假

or的两个操作数一个为真就是真,两个都不为真才为假

not 逻辑取反,如果not的操作数本身为真,则加了not为假

python不同于其他语言特殊的写法

a<b and b<c 可以直接写成a<b<c

关于短路求值

对于 and, 如果左侧表达式为 False, 则整体一定为 False, 右侧表达式不再执行. 对于 or, 如果左侧表达式为 True, 则整体一定为 True, 右侧表达式不再执行.

(4)赋值运算符

链式赋值

a = b = 10

多元赋值

a,b  = 10,20

eg:交换两个变量

基础写法

a = 10
b = 20

tmp = a
a = b
b = tmp

基于多元赋值

a = 10
b = 20
a,b = b,a

复合赋值运算符

Python 还有一些 复合赋值运算符. 例如 += -= *= /= %= 其中 a += 1 等价于 a = a + 1 . 其他复合赋值运算符也是同理.

3.基础语法(2)

3.1 条件语句

条件语句又叫分支语句,表示了接下来的逻辑会有几种走向

Python中使用If、else来表示条件语句

if,else命中条件后执行的“语句块”,要用缩进来表示

if expression:
    do_something1
else:
    do_something2

next_thing

如果expression值为True,则执行do_something1

否则执行do_something2

if expression1:
    do_something1
elif expression2:
    do_something2
else:
    do_something3

如果expression1的值为True,则执行do_something1

如果expression2的值为True,则执行do_something2

否则执行3

eg:输入 1 表示愿意认真学习, 输入 2 表示躺平摆烂.

choice = input("输入1表示认真学习,输入2表示躺平摆烂")
if choice == 1:
    print('你会找到好工作!')
elif choice == 2:
    print('你可能毕业就失业了!')
else:
    print('你的输入有误')

eg:输入一个整数, 判定是否是奇数

a = int(input('请输入一个整数'))
if a%2 == 0:
    print('偶数')
else:
    print('奇数')

eg:输入一个整数,判断它是正数还是负数

a = int(input('请输入一个整数'))
if a > 0:
    print('正数')
elif a < 0:
    print('负数')
else:
    print('是0')

eg:判定年份是否是闰年

year = int(input('请输入年份'))
if year % 100 == 0:
# 判断世纪闰年
    if year % 400 == 0:
        print('闰年')
    else:
        print('平年')
else:
# 判断普通闰年
    if year % 4 == 0:
        print('闰年')
    else:
        print('平年')


简短版本

simple edition

year = int(input('请输入年份'))

if (year % 100 != 0 and year % 4 == 0) or year % 400 == 0:
    print('闰年')
else:
    print('平年')

空语句pass

代码示例

eg:输入一个数字,如果是1,打印'hello'

a = int(input('请输入一个数字'))

if a == 1:

    print('hello')

等价于

a = int(input('请输入一个数字')
if a != 1:
    pass
else
    print('hello')

此时pass只是占了一个位置,防止分支因为没有语句而报错

3.2 循环语句

(1)while 循环

语法体

while 条件:

        循环体

条件为真 , 则执行循环体代码 .
条件为假,则结束循环
eg: 打印 1-10 的整数
num = 1
while num <= 10:
    print(num)
    num += 1

eg:计算1到100的和

sum = 0
num = 1
while num <= 100:
    sum += num
    num += 1
print(sum)

eg:计算5的阶乘

num = 1
result = 1
while num <= 5:
    result *= num
    num += 1
print(result)

eg:求1! + 2! + 3! + 4! + 5!

num = 1
sum = 0
while num <= 5:
    factorResult = 1
    i = 1
    while i <= num:
        factorResult *= i
        i += 1 
    sum += factorResult
    num += 1
print(sum)
这个程序用到了两重循环 .
也就是在循环语句中也可以套循环 .
(2)for循环

for循环的语法格式

for 循环变量 in 可迭代对象

所谓的可迭代对象就是说,内部含有多个元素,能把这些元素一一取出来的特殊变量

eg: 打印1到10 

for i in range(1,11)
    print(i)

range函数可以生成一个可迭代对象,生成的范围是1到11左闭右开区间,也就是1到10十个元素

eg:打印2,4,6,8,10

for i in range(2,12,2)
    print(i)

通过range的步长,可以指定迭代时的步长,也就是让一次循环变量加几

eg:打印10到1

for i in range(10,0,-1)
    print(i)

步长可以设置为负数

eg:求1到100的和

sum = 0
for i in range(1,101)
    sum += i
print(sum)

接下来我们介绍一下cotinue 和 break

        continue 表示结束这次循环,进入下次循环

eg:模拟吃包子,吃到第三个包子吃出个虫

for i in range(1,6):
    if i == 3:
        continue
    print(f'吃完第{i}个包子')

break表示结束循环

eg:模拟吃包子,吃到第三个包子迟到半只虫,不吃了

for i in range(1,6):
    if i == 3:
        break
    print(f'吃完第{i}个包子')

eg:输入若干个数字,求平均值

sum = 0
count = 0
while True:
    num = input('请输入数字')
    if num == ';':
        break
    num = float(num)
    sum += num
    count += 1
print(sum/count)
(3)人生重开模拟器小程序

4.基础语法(3)

4.1 函数

编程中的函数,是一种可以重复使用的代码片段,可以提高代码效率

eg:求数列的和,不适用函数

# 求100到200的和
sum = 0
for i in range(100,201):
    sum += i
print(sum)

# 求300到400
sum = 0
for i in range(300,401)
    sum += i
print(sum)

像这种代码很相似,我们可以把他提取出来做成一个函数,如果需要的话直接调用这个函数

eg: 求数列的和,使用函数

# 定义函数
def calcSum(begin,end)
    sum = 0
    for i in range(begin,end + 1)
        sum += i
    print(sum)
        
#调用函数
calcSum(1,100)
calcSum(200,300)

由此,大家可以看到定义函数的语法格式为

def 函数名(形参列表):

        函数体

        return 返回值

函数定义并不会执行函数体内容 , 必须要调用才会执行 . 调用几次就会执行几次
函数必须要先定义,再使用
test3()
def test3:
    print('hello')
# 像这样,还没执行到定义,就先调用了,如此就会报错

关于形参和实参,python和c语言是一样的

唯一不同的点就在于python的形参不用指定类型,因为python的类型可以动态变化,换句话说,一个函数可以支持多种不同类型的参数
关于返回值
函数的参数可以视为是函数的 " 输入 ", 则函数的返回值 , 就可以视为是函数的 " 输出 "
def calcSum(beg,end):
    sum = 0
    for i in range(beg,end + 1):
        sum += i
    print(sum)


calcSum(1,100)

也可以写成

def calcSum(beg,end):
    sum = 0
    for i in range(beg,end):
        sum += i
    return sum



result = calcSum(1,100)
print(result)

我们会比较倾向于第二种写法,我们有个原则,即逻辑与用户交互分离,如果用第一种写法的话,那我们以后要进行诸如把计算结果存在文件里,或者发送到网络上,就会出现问题,所以我们一般用第二种写法,函数体只进行逻辑运算,在函数外进行用户交互

一个函数中是可以有多个return的语句的

eg:判断是否为奇数

def isOdd(num):
    if num % 2 == 0:
        return False
    else:
        retirm True

result = isOdd(10)
print(result)

也可以直接写成下图这样

def isOdd(num):
    if num % 2 == 0:
        return True
    return False

如果num是偶数,就直接进入到分支,在该分支里return回到调用的地方了 也不会往下执行了,所以我们在这里可以不写else

一个函数是可以一次返回多个返回值的,使用,来分割不同返回值

def getPoint()
    x = 10
    y = 20
    return x , y 


a,b = getPoint()

如果只想返回部分返回值,则可以用_来忽略不想要的返回值

def getPoint()
    x = 10
    y = 20
    return x , y 


_ , b = getPoint()
def getPoint():
    x = 10
    y = 20
    return x,y

x,y = getPoint()

观察上面的代码,可以发现函数体里有x,y,外面也有x,y

但是这两组变量并不是 同一个变量

只是恰好名字一样了

在函数定义的变量,一旦超出范围,就不能在使用了,否则会报错

def getPoint()
    x = 10
    y = 20
    return x,y




print (x,y)

在不同的作用域中,允许存在同名变量,他们虽然名字相同,但确实不是同一变量

x = 20
def test():
    x = 10
    print(f'函数内部x = {x}')


test()
print(f'函数外部 x = {x}')

在函数内部定义的变量,就称为局部变量,在函数外部定义的变量就称为全局变量

如果函数内部访问局部变量找不到,就会去全局作用域里找

x = 20
def test()
    print(f'x = {x}')
test()

如果想要在函数内部,修改函数外的值,这时候我们就要引入一个global关键字声明

x = 20

def test():
    global x
    x = 10
    print(f'函数内部 x = {x}')

test()
print(f'函数外部 x = {x}‘)

如果此处没有globa,则函数内的x = 10就会被认作是创建一个函数内的局部变量,这样就和全局变量不相关了

把一个函数的返回值作为另一个函数的参数,这种操作叫做函数的链式调用

def isOdd(num):
    if num % 2 == 0:
        return False    
    return True


result = isOdd(10)
print(result)

# 也可以直接写成
print(isOdd(10))

函数的递归 函数的递归是一种特殊的嵌套调用,指的是函数调用它自己

函数内部还可以调用其他函数,这种操作叫做嵌套调用

eg:递归计算 5!

def factor(n):
    if n == 1:
        return 1
    return n * factor(n-1)


result = factor(5)
print(result)

递归代码必须存在结束条件,比如说 n = 1的时候,递归结束

每次递归的时候要保证实参接近结束条件

Python的函数可以给形参指定默认值,带有默认值的参数,在调用的时候可以不传参

eg:计算两个数字的和

def Add(x,y,debug = false):
    if debug:
        print(f'调试信息x = {x},y = {y}')
    return x + y
print(Add(10,20))
print(Add(10,20,True)

带有默认值的参数应该放在不带有默认值的参数的后面

在调用函数的时候,需要给函数指定形参,一般情况下是按照形参的顺序,在Python里,还可以通过关键字参数来调整传参顺序

def test(x,y):
    print(f'x = {x}')
    print(f'y = {y}')

test(x = 10, y = 20)
test(y = 20,x = 10)

4.2列表和元组

在编程中,经常需要变量来保存数据

有时候如果数据比较多,我们可以用列表和元组来一次性表示多个数据

元组和列表是非常相似的,只不过列表在创建好之后里面的元素是可以修改的,但是元组里的元素是不能修改的

如何创建列表,创建列表有两个方式,[ ]表示一个空的列表

alist = [ ]
alist = list()
print(type(alist))

如果需要初始值,可以在[ ]写入初始值

可以直接用print打印列表的内容

列表中存放的元素可以是不同类型的元素

alist = [2,'hello',2.55]
print(alist)

访问下标,可以用下标访问操作符[]来获取到列表中的任意元素

下标是从0开始计数的

alist = [1,2,3,4]
alist[2]

通过下标不仅能读取元素的值,还能修改元素的值

alist = [1,2,3,4]
alist[2] = 100
print(alist)

如果下标超出列表的有效范围,则会抛出异常

因为下标是从0开始的,因此下标的有效范围是[0,列表长度-1],使用len可以获得元素个数

alist = [1,2,3,4]
print(len(alist))

下标可以写成负数,表示倒数第几个元素

alist[-1] == alist[len{alist) - 1]

切片操作

通过下标是取出其中的一个元素,而通过切片可以取出一系列连续的元素

使用[ : ]进行切片

alist = [1,2,3,4]
print(alist[1:3])

[1:3]表示的是从下标1到下标3的左闭右开区间,也就是从下标为1到下标为2的元素

切片操作也可以忽略前后边界.

alist = [1,2,3,4]
print(alist[1: ]) # 省略后边界,表示从下标为1的元素一直取到最后一个元素
print(alist[ :-1] # 省略前边界,表示从开头开始获取
print(alist[ : ]) # 省略前后边界,表示取出所有元素

切片操作也可以指定步长,所谓步长,就是说取出一个元素后,下标自增几步

alist = [1,2,3,4,5,6,7,8,9,10]
print(alist[::1])
print(alist[::2])
print(alist[::3])
print(alist[::5])

切片操作的步长也可以是负数

alist = [1,2,3,4,5,6,7,8,9,10]
print(alist[::-1])
print(alist[::-2])
print(alist[::-3])
print(alist[::-5])

如果切片中填写的数字越界了,并不会有负面效果,只是会尽可能的取到能取到的元素

那么,我们该如何遍历列表元素呢?

遍历,就是把元素一个个的取出来,然后再分别进行处理

遍历最简单的办法就是for 循环

alist = [1,2,3,4]
for elem in alist:
    print(elem)

也可以用for按照范围生成下标,按下标访问

alist = [1,2,3,4]
for i in range(0,len(alist)):
    print(alist[i])

    

除此之外,还可以使用while 循环,手动控制下标的变化

alist = [1,2,3,4]
i = 0
while i < len(alist):
    print(alist[i])
    i += 1

那么,如何新增元素呢?

这时候就要引入我们的方法了,那么什么是方法呢,方法就是函数,只不过它需要依赖于对象,像我们新增元素的方法就是append 和 insert

append 就相当于咱们数据结构里的尾插

alist = [1,2,3,4]
alist.append('hello')
print(alist)

而insert 则可以指定要插入的下标

alist = [1,2,3,4]
alist.insert(1,'hello')
print(alist)

insert的第一个参数就是要插入元素的下标,第二个参数就是要插入的元素

学完了新增元素的方法,那么紧接着我们学一下如何查找元素

第一种是使用in 操作符,判断元素是否在列表中存在,返回值是布尔类型

alist = [1,2,3,4]
print(2 in alist)
print(10 in alist)

另一种方法就是使用index查找元素在列表里的下标,如果存在,会返回一个整数,如果不存在,则会抛出异常

alist = [1,2,3,4]
print(alist.index(2))
print(alist.index(10))

删除,使用pop方法删除最末尾元素

alist = [1,2,3,4]
alist.pop()
print(alist)

此外,pop也能指定下标删除元素.

alist = [1,2,3,4]
alist.pop(2)
print(alist)

使用remove 方法,可以按照值来删除元素

.


alist = [1,2,3,4]
alist.remove(2)
print(alist)

连接列表

使用+可以把两个列表拼接在一起

此时的+会生成一个新的列表,而不会影响原来的列表

alist = [1,2,3,4]
blist = [5,6,7]
print(alist + blist)

另一个方法就是extend方法,可以把后一个列表拼接到前一个列表后面,会改变前一个列表,而不会改变后面拼接的列表

最后就是关于元组的知识

元组和列表的功能基本上是一致的

元组使用()来表示

atuple = ()
atuple = tuple()

元组不可以修改 里面的元素,而列表是可以修改的

列表里面读取的操作,列表里使用的读取元素的方法对元组也是适用的,比如说访问下标,切片 遍历,in ,index ,+等,都是支持的,而列表里新增元素,删除元素,extend在元组里是不适用的

另外,元组在python中很多时候是默认的集合类型,比如说,当一个函数返回多个值的时候

def getPoint():
    return 10,20

result = getpoint()
print(type(result))

既然有了列表了,那我们为什么还需要元组呢?

比如说你有一个列表,你要传到一个函数里,那么这个函数会不会把这个列表打乱呢?为了防止元素被打乱,你可以用元组

另一方面,下一节我们字典的键要求必须是可哈希对象,也就是不可变的,元组是不可变的也就是可哈希的而列表不是也就不行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值