Python学习-2021/3/8

安装

  1. Python

  2. Visual Studio Code文本编辑器(VSC编辑器)

课程1:Hello Python

  1. 在VSC编辑器中新建Hello.py文件;

  2. windows中的命令提示符(cmd)中执行.py文件:注意路径。转换盘符,直接输入D: E:等,之后利用cd进入存储.py文件的文件夹路径。最后运行python Hello.py文件;

  3. cmd是直接运行.py文件 给出最后的结果。而python的交互模式(可通过‘开始’找到)更适用于每行代码运行编译。

  4. 注意把存有.py文件的文件夹路径添加到VSC工作空间(workspace)

  5. print('1','2','3')可以同时输出多个字符串,遇到‘,’输出一个空格

  6. 输入:name = input() 之后可以键盘输入 Jie 给name变量

#class 1
print('Hello, Python')
name = input()
print(name)

课程2:Python语法

  1. Python代码是缩进式的,因此复制粘贴可能容易出问题

  2. 数据类型整数10_000=10000`;**浮点数**用科学计数法,`1.2e3=1200,1.2e-3=0.0012`;**字符串**,`'I am OK', "I'm OK", 'I\'m \"OK\"'

  3. 转义字符'':'\n'换行,'\'续写(三引号可以续写字符串),'\t'制表符,r' '表示字符串' '内不转义

  4. 布尔值'True''False':注意大小写;可以用'and' 'or' 'not'进行与或非运算

  5. 变量:静态语言(赋予变量类型)与动态语言(可以多次赋予不同类型值)

  6. 加减乘除:

    • '//'地板除法,10//3=3;1//3=0;
    • 取余,``10%3=1`;
    • 幂函数,**pow**(3,2) =3\**2=9;
    • 除法曲余,**divmod**(15,6) = (2,3);
    • 字符串相加,'Jie'+'Xu' = 'JieXu'
  7. Python3是用Unicode编码的因此其支持多语言字符串'讲真的a!';ord()把字符转变为编码,chr()把编码识别成对应字符

  8. 字符串内格式化:'%s'字符串替换,'%d'整数替换,

    a = 'Hi, %s' %'world'
    print(a)  #Hi,world
    a = '%d %%' % 7  
    print(a)  #7%
    
  9. f-string:

    r=2.5
    s=3.15*r**2
    print(f'The area of a circle with radius {r} is {s:.2f}')
    #The area of a circle with radius 2.5 is 19.69
    
  10. 数据类型:List、Tuple、Dict、Set

    • List有序表'[...]'

      • classmates = ['01','02','03',12,'ola',1.1,None];元素类型可以多样

      • **len**(classmates)=7

      • 索引是从0开始:classmates[0]='01';classmates[-1]='03'—倒数第一个

      • 添加元素:classmates.**append**('04'),添加到list的末尾

      • 插入元素到指定位置:classmates.**insert**(1,'002')-->['01','002','02' ....]

      • 删除特定位置元素:classmates.**pop**(1)

      • 替换list中特定位置元素可以直接赋值:classmates[1]='02'

      • list中可以内嵌另一个list:a = ['01','02','03'];b = ['05',a];则'01' = a[0]同样'01' = b[1][0]

        #list
        classmates = ['01','02','03'];
        classmates.pop(1)
        classmates.insert(1,'002')
        classmates.append('04')
        classmates[1]='02'
        print(classmates)
        print(len(classmates))
        print(classmates[0])
        classmate = ['05',classmates]
        print(classmates[0] == classmate[1][0])
        
    • Tuple元组'(...)'

      • classmates = ('01','02',['03','04'])

      • tuple中元素的指向不变,元组中的数据指向的序号不变,因此不可更改(结构不可更改),但是list可以是tuple的一个元素,而list内的数据是可以赋值的

      • tuple没有.append();.insert();.pop()方法

      • tuple更为安全,尽量使用tuple代替list

    • Dict字典'{...}'(键值对key-value存储)

      • 特点:查找速度快!以空间换时间!
      • score = {'a':60,'b':90}-->a的成绩=score['a']
      • 添加键值对:``score['c']=85`-->c的成绩=score['c']=85
      • 多次添加value给同一个key只能保留最后一次赋值的值:score['c']=85;score['c']=83;score['c']=80;-->c的成绩=score['c']=80
      • 判断key是否存在于dict中:可以用in判断 'd' in score;也可以用get()方法,print(score.get('d'))-->None表示不存在对应的键对;print(score.get('c'))-->80;get()方法也可以score.get('d',70)-->70但无法对已存在于dict中的键值对作用,score.get('c',70)-->80
      • dict中key通常为整数或者字符串,因为要求不可变所以list不行
    • Set无序不重复的集合'([...])' 需提供一个list作为输入 是一组key的集合但是不存储value

      1. number = set([1,2,3])-->{1,2,3};number = set([1,2,2,4,3,3])-->{1,2,3,4};
      2. 添加key:number.add(5)
      3. 删除key:number.remove(5)
      4. 两个set之间可以进行交集并集处理:交集,number & numbers;并集,number | numbers
      5. set中的key也是不可变的,因此同样不能是List。
      6. set与dict中可以用不包含list的tuple(如(1,2,3))作为key,但是成分中包含list的(如(1,[2,3]))不可
  11. 判断语句:if ;elif ;else

    age = input()
    A = int(age)
    if A < 20:
        print('小年轻!')
    elif A < 30:
        print('不小了!')
    else:
        print('0.0!')
    
  12. 循环

    • for-in循环

      #for in
      ages = [1,2,3,4,5]
      for age in ages:
          print(age)
      sum = 0
      for age in ages:
          sum = sum+age
      print(sum)
      
* `range(101)`:生成0-100的序列,`list(range(101))`:变成有序表

* **while循环**

  ```python
  ages = list(range(11))
  a=0
  while ages[a]<=10:
      print(ages[a])
      a+=1 
  ```

* **break:结束循环**

  ```python
  ages = [1,2,5,4,6,15,26,14]
  a = 0
  while ages[a]<=100:
      print(ages[a])
      if a >= 5:
          print('END')
          break
      a = a+1
  ```

* **continue:跳过当前循环进入下一次循环**

  ```python
  num = range(11)
  a = 0
  while num[a]<10:
      a = a+1
      if num[a]%2 == 0:
          continue
      print(num[a])
  ```

  死循环可用Ctrl+c退出;注释代码块可用三个单引号或者三个双引号,即'''代码块'''或者"""代码块""";单行代码块注释用'#'

课程3:函数

  1. 函数是一种代码抽象的方式,可以让程序员更加关注结果而不是底层计算过程

  2. Python内置函数:具体函数参考Built-in Functions

  3. 运算函数:abs();max();min()

  4. 数据类型转换函数:str();int();float();bool(x)(只有当x为false或者忽略/空时返回false)

  5. 可以把函数名赋予一个变量,之后直接调用这个别名即可。p = print;p('Hello')-->Hello

  6. 定义新函数

    • def function_1(parameter1,2,3...): 以return结束函数的运行

    • 没想好具体怎么写函数 可以用pass代替return 防止程序运行不出错

    • 定义的函数可以同时返回多个值,因为Python函数返回值类型是一个tuple,只是代码中省略了'()'

    • 导入包,后续可以使用包里的函数:如import math

      def my_func1(a):
          pass
      
      def my_func2(b):
          if b >= 0:
              return b, 0
          else:
              return 0
      p = print
      p(my_func2(2))
      p(my_func2(-2))
      
  7. 函数的参数

    • 定义函数时参数可以定义明确的数量,通常是按照顺序取入参数值(即取入位置参数),也可以定义一些默认参数

    • 设置默认参数后,调用函数时,参数输入如果是乱序的需要注意添加参数名赋值my_func3(n=3,a=2)

    • 可变参数:参数可变的函数可以将输入的参数需要封装在一个list或者tuple中实现,同样也可以在参数前加入*实现。如果想将一个list或者tuple作为参数传入这个可变参数的函数,只需在调用时在list和tuple前加上*即可。可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。

      def my_func4(numbers):
          sum = 0
          for n in numbers:
              sum = sum+n*n
          return sum
      print(my_func4([1,2,3,4]))
      
      def my_func5(*numbers):
          sum = 0
          for n in numbers:
              sum = sum+n*n
          return sum
      print(my_func5(1,2,3,4))
      print(my_func5(*[1,2,3,4]))
      print(my_func5(*(1,2,3,4)))
      
    • 关键字参数:关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。传入的city='Beijing'被组装成了一个dict;而单独的dict可以直接用加的方式调用;关键字参数后不能再添加参数,不然会报错**

      def person(name,age,**x):
          print('name:',name,'age:',age,'other:',x)
      
      person('xj',12,city='Beijing')
      a = {'city':'Beijing','gender':'男'}
      person('xj',12,city=a['city'],gender=a['gender'])
      person('xj',12,**a)
      
    • 命名关键字参数:函数参数中'*,'后参数为关键字参数,如果没有输入对应的关键字参数则Python会报错提醒;命名关键字参数必须传入参数名,否则会报错;如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了;命名关键字参数可以有默认值(city='Beijing'

      def person3(name,age,*x,city='Beijing',gender):
          print(name,age,x,city,gender)
      person3('a',12,*['teacher'],gender='男')
      
    • 参数组合:在Python中定义函数,可以用必选参数默认参数可变参数关键字参数命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数(位置参数)、默认参数、可变参数、命名关键字参数和关键字参数

      def f1(a,b,c=0,*d,**e):
          print('a=',a,'b=',b,'c=',c,'d=',d,'e=',e)
      
    • 递归函数:汉诺塔问题,将n个盘从a搬到b

      def move(n,a,b,c):
          if n==1:
              print(a,'-->',b)
          else:
              move(n-1,a,c,b)
              print(a,'-->',b)
              move(n-1,c,b,a)
      

课程4:高级特性

  1. 切片:Slice

    • names = [...,'a','b','c','d'];names[n:N]指取names中的序号为n到N-1的值总共N-n(n,N>0正序)或者N-n+1(n,N<0反序)个量;names[0:2] == names[:2]

    • 也可以按倒序切片:names[-2:]-->['c','d']

    • 间隔取数,names[::n]:所有数每n个取1个;names[:10:2]:前十个数每2个取1个

    • tuple和字符串都可以进行切片,切片后都是相应的类型

    • 字符串s=''时s[0]、s[-1]都会报错,但是可以通过s[:1]和s[-1:]return自身

      names = ['a','b','c','d']
      print(names[1:3])
      numbers = list(range(101))
      a = numbers[::5]
      num_tup = tuple(range(11))
      b = num_tup[-5:]
      num_str = '0123456789'
      a = num_str[0:5]
      
  2. 迭代:Iteration

    • Python迭代是通过for...in...实现的,相较于java的下标控制迭代更加抽象

    • list,tuple,dict,set,string都可以迭代。其中dict默认迭代key,value迭代可以使用num.values(),同时迭代key,value使用num.items(),且dict迭代结果顺序很可能不一样。

    • 如何判断一个对象是可迭代对象呢?方法是通过collections.abc模块的Iterable类型判断

    • enumerate函数把list变成序号-元素对,使得在for循环中可以同时迭代序号及元素数据

      num1 = [1,2,3,4,5]
      num2 = (1,2,3,4,5)
      num3 = {'a':1,'b':2,'c':3}
      num4 = set([1,2,3,4])
      num5 = 'abc123'
      print(num1,num2,num3,num4,num5)
      
      for a in num1:#list
          print(a)
      for a,b in enumerate(num1):
          print(a,b)  
      for a in num2:#tuple
          print(a)
      for a in num3:#dict: key
          print(a)
      for a in num3.values():#dict: value
          print(a)
      for a,b in num3.items():#dict: key,value
          print(a,b)
      for a in num4:#set
          print(a)
      for a in num5:#string
          print(a)
      #判断数据是否可以迭代
      from collections.abc import Iterable
      print(isinstance('ab',Iterable))
      print(isinstance(12,Iterable))
      print(isinstance([1,2],Iterable))
      #for循环中同时迭代两个变量
      num7 = [(1,2),(3,4),(5,6)]
      for a,b in num7:
          print(a,b)
      
  3. 列表生成式

  • 它是Python内置的非常简单却强大的可以用来创建list的生成式

  • 在list内部使用for循环,dict类型的可以同时迭代两个变量来生成list;dic1 = [m+'='+str(n) for m,n in d.items()];字符串可以同时大小写用lower()和upper()函数

  • if...else...放在for循环前面,是对list元素的判定及操作;注意与for循环后面的if判定(对循环内主体的判定)区分;前者相当于对数学函数中的结果的处理(根据x的判定),后者相当于对数学函数定义域的处理

    L1 = [x*x for x in range(1,11)]
    L2 = [x*x for x in range(1,11) if x%2==0]
    L3 = [x*x if x%2==0 else -x*x for x in range(1,11)]
    L4 = [x+y for x in range(1,11) for y in range(2,12)]
    print(L1)
    print(L2)
    print(L3)
    print(len(L4))
    
    import os
    dir1 = [d for d in os.listdir('.')]#列出当前文件夹下的文件和目录
    print(dir1)
    
    d={'x':1.'y':2}
    dic1 = [m+'='+str(n) for m,n in d.items()]
    dic2 = [m+'='+str(n).upper() for m,n in d.items()]
    print(dic1)
    print(dic2)
    
  1. 生成器:如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator
  • 把列表生成式中的'[]'改成'()'即可

  • 生成器保存的是一种算法 而不是具体的数据

  • 一个个打印生成的list用next()函数,g=(x*x for x in range(0,11)); print(next(g));print(next(g))

  • for循环输出g中的数据,因为generator也是可迭代的;for x in g:...

  • 复杂函数不能直接用'()'定义出来的话就需要重新定义一个generator函数,关键词用'yield'代替普通函数中的'return'

  • 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    #生成器generator
    g = (x*x for x in range(0,11))
    print(next(g))
    for x in g:
        print(x)
        
    #generator函数
    def fib(x):
        n,a,b = 0,0,1
        while n<x:
            yield(b)
            a,b = b, a+b
            n = n+1
    for x in fib(6):
        print(x)
        
    #10行杨辉三角
    def triangles():
        n = [1]
        x = 0
        while True:
            yield n[:]#返回此刻n的全部值后续对n的操作不影响返回值
            n.append(0)
            n = [n[i]+n[i-1] for i in range(len(n))]
            x = x+1
            if x==10:
                break
    
    results = []
    for x in triangles():
        results.append(x)
    
    for y in results:
        print(y)
    
  1. 迭代器
  • list tuple dict set str包括generator生成器及包含yield语句的函数都是可迭代的(Iterable)或者说可以在for循环中使用的对象类型都是Iterable的;from collections.abc import Iterable;isinstance([],Iterable);-->True

  • 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用isinstance判断一个对象是否是Iterator对象

  • list tuple str等类型可以通过Iterator包中iter()函数转为迭代器

  • for循环--迭代性Iterable next()---迭代器

    #迭代器
    from collections.abc import Iterable,Iterator
    isinstance('abc',Iterable)
    print(isinstance(iter('abc'),Iterator))
    a = iter('abc')
    while True:
        try:
            print(next(a))
        except StopIteration:   #遇到停止迭代则跳出循环
            break
    
  1. 高阶函数
  • 函数本身可以赋值给变量:f = abs;

  • 函数作为变量传入另一个函数:def abc_a(x,y,f):#f可以是一个函数

    #高阶函数
    f = abs
    def num_cal(x,y,f):
        return x+f(y)
    print(num_cal(1,-2,f))
    
  1. Python内置函数:map()和reduce()
  • map()接收两个参数,一个是函数,一个是Iterable量(只能有一层迭代关系,L1 = ['ac','bd']这个不能直接作为输入,得使用L[0]/L[1]作为输入的Iterable量);返回一个Iterator量
  • map()返回的量可以通过list把返回的Iterator直接生成列表
  • reduce()接收两个参数,将结果继续与序列的下一个元素做累积;from functools import reduce;
  • map可以作为reduce的第二输入参数
#map
from collections.abc import Iterable,Iterator
def f1(x):
    return x*x
map1 = map(f1,[1,2,3,4])
print(next(map1))
map2 = list(map1)#直接生成list
print(map2)
print(isinstance(map1,Iterable))
print(isinstance(map1,Iterator))
#map函数返回一个Iterator
L1 = list(map(str,[1,2,3,4]))
#将一个list中的数字转变成str然后再返回一个list
print(L1)
L2 = list(map(str.upper,['a','b']))
print(L2)
#reduce
from functools import reduce
def sum1(x,y):
    return x+y
Re1 = reduce(sum1,[1,2,3,4,5])#15
Re2 = reduce(sum1,['a','b'])#ab
print(Re1)
print(Re2)

def math1(x,y):
    return x*10+y
Re3 = reduce(math1,[1,3,5,7,9])#13579
print(Re3)

dict1 = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def char2num(x):
    return dict1[x]

reduce(math1,map(char2num,'13579'))#'13579'-->13579
  1. filter
  • 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter把传入的函数依次作用于每个元素,然后根据返回值True还是False决定保留还是丢弃该元素

  • filter返回的也是一个Iterator,同样可以用list(filter(f,a))的方式将其保留到一个list中

    #filter
    def is_odd(x):
        return x%2==1
    Od = filter(is_odd,[1,2,3,4,5,6,7,8,9])
    print(list(Od))
    
    #filter练习 输出1-1000中的回数 121 242 131等
    def numb1():#全体整数1-1000
        n = 1
        while True:
            n = n+1
            yield n
            if n>=1000:
                break
    def num_rev(x):#整数的倒序
        x1 = str(x)
        n = len(x1)
        x2 = 0
        for n1 in range(n):
            x2 = x2+int(x1[n1])*10**n1
        return x2
    
    def is_palindrome(x):
        return x==num_rev(x)
    L_fi = list(filter(is_palindrome,numb1()))
    print(L_fi)
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容