美文网首页
python基础学习(一)基础语法与变量

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

作者: 温岭夹糕 | 来源:发表于2023-12-11 10:28 被阅读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 的六个标准数据类型中:

    • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
    • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

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

    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字典操作

    字典内置函数:

    • map.items() 访问字典的键值对
    • map.keys() 访问字典键
    • map.values()访问值
    • map.get(xxx) 访问指定键,不存在返回None
    • map.setdefault(a[,b])顾名思义,存在key返回值,不存在则插入键值对

    判断字典是否存在某个键
    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):
    
    • scan表示每次跳跃的距离,默认为1;
    • start不写就是默认0
    • end不包括
    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这篇就够了

    相关文章

      网友评论

          本文标题:python基础学习(一)基础语法与变量

          本文链接:https://www.haomeiwen.com/subject/mxfmgdtx.html