python基础学习(一)基础语法与变量

2023-12-11  本文已影响0人  温岭夹糕

写在开头

通过与golang(>=2.0)对比学习,从而快速上手py(python>=3.9)
运行第一个py程序
vscode下创建a.py写入(与go定义包名和main函数不同)

print("a")

右键选择终端运行py代码即可
python3.12官方文档地址在这里

1.缩进

在GO语言的学习中,我们通常使用大括号"{}"来标识一个代码块,而python使用缩进层次来组织代码块,约定一个缩进用4个空格标识(必须严格执行)

if True:
    print("neo")
else:
    print("smile")

多行语句使用反斜杠\作为语句结束(包含括号就不需要反斜杠)

total = item_one + \
        item_two + \
        item_three
days = ['Monday', 'Tuesday', 'Wednesday',
        'Thursday', 'Friday']

2.引号和注释

在go中,单引号通常表示rune或byte类型,反引号表示字面量输出,双引号表示字符串
py中,单引号、双引号、三引号都表示字符串,其中三引号和go的反引号相似,多行文本格式化输出

word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""

注释使用"#"开头

# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.

3.换行输出print

函数print默认就是换行的,当被赋予变量时,表示从命令行模式中获取输入

var1 = print("1")
# 1 aaaa
# var1 = "aaa"

4.变量

4.1变量声明

go的变量声明与赋值方式有两种:var字面量和类型推断

var a int=1
b:=1

py与php类型,变量没有类型,直接声明

a=1

所以py是动态语言,在运行时才会被确认类型

4.2多变量赋值

除了和go一样的多变量外,还多出一个连等

a,b,c=1,2,"a"
a=b=1

4.3常量

在go中使用const,py则使用全部大写表示

BI=3.14

4.3.1内置常量

即None,go的nil是内置变量可被修改,这个是常量,表示为空

5.数据类型

Python3 中有六个标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)、Dictionary(字典)。
Python3 的六个标准数据类型中:

这里的不可变指,数据对应变量的值发生变化,内存也会跟着变(指之前的内存地址保存的不可变);反之可变为内存不变

5.1数字number

py3支持整形int、浮点型float、布尔bool和复数complex(高等数学内容),类型转换和四则运算与go无差异

a=False

5.2不可变序列-字符串

和go一样都可以对字符串进行切片操作s[0]

a="aaa"
a[2]="b"
print(a)

当然上述代码和go一样是不通过的,因为内存内容不可变
这里谈一下格式化输出和连接字符串,py更推荐使用format格式化输出

a="aaa"
b="{},{}".format("hello","world")
print(b)
b="{0},{1},{0}".format("hello","world")
print(b)

连接字符串虽然使用加号也可以,但每次操作会重新计算开辟和释放内存,效率更低,因此推荐使用join

l = ['2017', '03', '29', '22:00']
s5 = '-'.join(l)            # '2017-03-29-22:00'
s6 = s5.split('-')          # ['2017', '03', '29', '22:00']

5.2.1字符串编码

和go一样都是unicode编码(好像大部分语言都是如php和js),下面是网络传输的网络字节序转换实例

str = '学习Python'
print (str.encode()) #默认utf-8编码
print (str.encode('gbk'))
print (str.encode().decode('utf8'))

5.2.2切片步长和负步长

py的切片可以给元素设置步长

a=[1,2,3,4,5,6,7]
b = a[0:6:2]
print(b) #1,3,5 end是不包括

负步长很好理解,从后往前遍历

5.3不可变序列-元组Tuple

和枚举类似,一旦声明,不能修改(包括成员和长度,这点和字符串一样属于不可变序列)
因为不能修改,因此元组主要用于处理一次性数据(这也是列表和元组区别)
我们使用圆括号()定义元组或者tuple函数创建元组

letters = ('a','b','c','d','e','f','g')
print(letters[0])  # 输出 'a'
print(letters[0:3])  # 输出一组 ('a', 'b', 'c')
del letters

5.4可变序列-List列表

处理同类可重复的数据使用列表,使用中括号[]声明或者list()隐式转换,使用del删除列表或成员
列表有序可重复,类似go切片,长度和成员都可变

a=list("red")
del a[1]
print(a) #['r', 'd']
print(type(a))#<class 'list'>

Weekday = ['Monday','Tuesday','Wednesday','Thursday','Friday']
#搜索
print(Weekday.index("Wednesday"))
增加
Weekday.append("new")
删除
Weekday.remove("Thursday")

5.4.1列表常见操作

添加元素分别为分别为insert,append,extend image.png

这里注意extend参数是可迭代对象,可迭代对象通俗点说法就是可以被for ... in ...执行的对象,本质是实现了 iter() 方法或者 getitem() 方法的类,用go语言描述就是下面两接口的实现之一

type iteral interface {
  iter()
}
type iteral2 interface {
  getitem()
}

下面是py3自定义可迭代对象demo,使用isinstance判断

from collections.abc import Iterable

class A :
  pass

class B:
  def __iter__(self):
    return self

a = A()
b = B()
print(isinstance(a,Iterable) )#False
print(isinstance(b,Iterable) )#True

那么py内置的可迭代对象有哪些?

The collections.abc.Sequence abstract base class defines a much richer interface that goes beyond just getitem() and len(), adding count(), index(), contains(), and reversed(). Types that implement this expanded interface can be registered explicitly using register().

支持下标访问,即实现了getitem方法;可通过len方法获取长度,即定义了len方法,那不就是list列表,str字符串,元组tuple和bytes吗,其实还可以使用range函数返回一个可迭代对象,之后会提及
综上我们也就知道了下面这行代码错误的原因

a=[1,2]
a.extend(1)
#TypeError: 'int' object is not iterable
修改元素 image.png 计算长度使用len和count image.png 排序使用sort image.png

5.5集合Sets

无序不重复,不能被索引
使用大括号{}定义或者set()创建

a_set = {1,2,3,4}
# 添加
a_set.add(5)
print(a_set)  # 输出{1, 2, 3, 4, 5}
# 删除
a_set.discard(5)
print(a_set)  # 输出{1, 2, 3, 4}

5.5.1set常见操作

image.png

5.6字典map

没啥好说的,go的map
键不能重复,并且整形1和浮点型1.0会被当成相同的键这点需要注意
使用大括号定义或dict()函数创建

Logo_code = {
 'BIDU':'Baidu',
 'SINA':'Sina',
 'YOKU':'Youku'
 }
print(Logo_code)
# 输出{'BIDU': 'Baidu', 'YOKU': 'Youku', 'SINA': 'Sina'}
print (Logo_code['SINA'])       # 输出键为 'one' 的值
print (Logo_code.keys())   # 输出所有键
print (Logo_code.values()) # 输出所有值
print (len(Logo_code))  # 输出字段长度

5.6.1字典操作

字典内置函数:

判断字典是否存在某个键
has_key在py3中被移除,推荐使用关键词in

m = {1:"a"}
print(1 in m)
print(2 in m.keys())

移除键使用pop()或popitem(),区别是后者会返回值
除此以外py3.9字典还支持 |=运算符,即新旧字典键相同时,用新的值去替换

image.png
使用zip函数合并两个列表为字典 image.png

6.流程控制

主要还是讲讲go没有的吧(if else谁都有)
还需要注意的是match/cass 是3.10的语法,用法和switch一样

6.1 for

官方文档的定义是将for和in绑定使用的 image.png

也就是是for 变量名 in 可迭代对象 ,且根据定义描述后面是可以跟else语句的,当迭代器迭消耗完时执行else语句(即break不执行else语句)

m=list("red")
for str in m:
  if str=="e":
    break
  else :
    print(str)
else :
  print("bye")

6.2 while

和go的for类型,不同的是可以添加逻辑判断

count = 0
while count < 5:
   print(count, " is  less than 6")
   count = count + 1
else:
   print(count, " is not less than 6")

6.3 序列-range对象

image.png

如果你需要一个可迭代对象,内置函数 range() 会很方便,它生成一个等差级数链表:

range (start, end, scan):
for i in range(6,12,2):
  print(i)

#6,8,10

a = ['i', 'love', 'coding', 'and', 'free']
for i in range(len(a)):
    print(i, a[i])

6.4pass空语句

Python pass 是空语句,是为了保持程序结构的完整性。它用于那些语法上必须要有什么语句,但程序什么也不做的场合(因为py不用大括号表示代码块)

class MyEmptyClass:
  pass

7.函数

语法

def 函数名(参数列表):
    函数体

函数体中不带表达式的return相当于返回None
同时py也支持返回多个值

8.模块

语法

import 模块名

模块名就是文件名,调用和go一样,如下

# hello.py
def sayhello(a):
  print("hello",a) 

#main.py
import hello
hello.sayhello("a")

8.1 from import

允许py从模块中导入指定的变量、函数或类等

from 模块名 import 符号

如下,调用时就不需要加上包名

from hello import sayhello
sayhello("a")

同时from ... import * 就表示全部

9.包

类似go的package以目录组织文件方式,py包结构如下

pakageName
-------__init__.py
-------moduleName1.py
-------moduleName2.py
------- ...

也就是说包路径下必须有init.py文件(里面不需要写内容),此时模块名就变成了目录名

10.协程

和js一样使用async def修饰函数,是py3.7功能

文章参考

学py这篇就够了

上一篇 下一篇

猜你喜欢

热点阅读