环境变量的配置

  • 在下载、解压、准备编译环境、安装依赖包、预编译、编译和安装完成后,前往
    • 需要配置环境变量
  • PATH:
    • 目的,让系统帮我自动找到命令执行文件路径
    • path值:一堆目录,每隔目录之间用: 隔开 ```bash vim ~/.bashrc 新增内容

PATH=$PATH:/usr/python-3.6.1/bin

还可以定义一个新变量 PYTHON_HOME, 以后就只需要更改一个地方了

  1. - 生效 `source ~/.bashrc`
  2. - /etc/profile 是整个系统的环境变量配置文件,尽量不改,是不好的习惯
  3. - 最后安装一个小工具ipython
  4. - `pip3 install ipython3` 使用python3,就用 /bin 下面的ipython3
  5. - 然后,windows 之后也要安装py
  6. <a name="pYRbS"></a>
  7. # 编写程序
  8. - shell 一样,python也是解释性语言,

vim 01anli.py

!/usr/python-3.6.1/bin/python3

print(“hello world”) def main(): print(“end~”)

  1. - 赋予执行权限后,同样可以运行
  2. - `chmod u+x 01anli.py` `./01anli.py`

vim ~/.vimrc set nu set ts=4 制表符占4个字符 set sw=4 向左向右异动时占4个字符

  1. - python2 要运行程序,需要添加一行 `#encoding=UTF-8` 因为python2中不支持中文的字节编码
  2. - 或者 `# -*- coding: utf-8 -*-`
  3. - ipython3 好用
  4. ---
  5. - 变量三个要素:变量的名字,~~变量的类型~~,变量的值
  6. - 标识符:由字母、下划线和数字组成,且数字不能开头,一些特殊含义的字符不行。
  7. - 区分大小写
  8. - 小驼峰命名法,大驼峰命名法,
  9. - 还有就是用下划线“_ 来连接所有的单词(就不用区分大小写了),一般用这个
  10. - 查看关键字(保留字)
  11. - `import keyword` `keyword.kwlist`
  12. ```python
  13. vim 03shuchu.py
  14. a=35
  15. b=2
  16. my_name="xiaobai"
  17. # 如果有表达式用小括号, 如果有多个变量替换也要加小括号,并且每个变量用逗号隔开
  18. # s是字符串(所有的类型)的变量替换, d是整数,f 是浮点数,x 是十六进制整数
  19. print ("wode nianling wei: %dsui~,我的名字是: %s"%(a+b,my_name))
  20. #输出的钱都是四位数,如果不够4位用0填充
  21. print ("我有人民币:%04d钱"%money)
  22. # 精确到小数点后两位
  23. print ("圆周率是: %.2f"%money)
  24. # 每一个%表示一个占位符, %% 第一个表示转义符
  25. print ("我们的胜率是: %d%%"%a)
  26. #python3将输入的内容作为字符串,2中input输入的内容作为表达式(所以可能被传入恶意代码)
  27. age=input("请输入年龄: ")
  28. print (type(age))
  29. age=int(age)+2
  30. print ("你的年龄为: %s"%age)
  • if elif else 判断

    1. age=int(input("请输入年龄: "))
    2. sex=input("请输入性别: ")
    3. #and 并且, or 或者, not 不满足后面的条件
    4. if age >= 18 and sex == "男" :
    5. print ("可以做苦力")
    6. elif age < 18 or sex == "女" :
    7. print ("不用做苦力")
    8. #sex !='女' and sex != '男'
    9. elif not (sex == '女' or sex == '男' ) :
    10. print ("非男非女")
    11. else :
    12. pass#以后要填充代码,为保证不出现语法错误
  • 特殊的真和假 ```python age=int(input(“请输入值: “)) if age : print (“age 非 0”) else : print (“age = 0”)

name=”” if name: print (“name 不是一个空字符串”)

  1. - 练习,
  2. ```python
  3. shengao=float(input("身高: "))
  4. tizhong=float(input("体重: "))
  5. print ("小明的身高为:%.2f,体重为:%.2f"%(shengao,tizhong))
  6. # / 表示浮点数除法,返回float结果;// 表示整数除法,返回一个不大于/ 计算结果的最大整数int
  7. bm=tizhong/(shengao**2)
  8. print ("BMI指数为: %s"%bm)
  9. #print ("BMI指数为: %.2f"%bm)
  10. #sbm=("%.2f"%bm)
  11. #print ("sbm zhishu wei: %s"%sbm)
  12. if bm < 18.5 :
  13. rprint ("过轻")
  14. elif bm >= 18.5 and bm < 25 :
  15. print ("正常")
  16. elif bm >= 25 and bm < 28 :
  17. print ("过重")
  18. elif bm >= 28 and bm < 32 :
  19. print ("肥胖")
  20. else :
  21. print ("严重肥胖")

循环

  1. # 打印一个矩形
  2. y=1
  3. while y<=10 :
  4. x=1
  5. while x<=10 :
  6. #print函数默认在输出后就换行,在ipython3里面 help(print)
  7. print ("*",end="")
  8. x+=1
  9. print ("\n") #print ("") 输出一个空的字符串也是换行
  10. y+=1
  11. print ("已经完成~")
  • 循环多少次(while中循环次数由条件决定)
  • 在循环过程中做什么
  • 变量怎么变化?
    1. #打印九九乘法表
    2. 14 hang=1
    3. 15 while hang<=9 :
    4. 16 lie=1
    5. 17 while lie<=hang :
    6. 18 print ("%d*%d=%d\t"%(lie,hang,lie*hang),end="")
    7. 19 lie+=1
    8. 20 #换行
    9. 21 print ("")
    10. 22 hang+=1
    11. 23 print ("结束了~")
  • break 和 continue
    1. age=int(input("请输入年龄: "))
    2. i=1
    3. #相当于不知道循环多少次,一直到满足break的条件后循环就会终止
    4. while True :
    5. if i==age :
    6. print ("你的年龄为: %d"%i)
    7. break
    8. else :
    9. print ("caicuole! ")
    10. i+=1
  1. i=0
  2. while i<10 :
  3. i+=1;
  4. if i%2==0 :
  5. print ("%d 是偶数"%i)
  6. continue
  7. #continue,不管循环语句内的后面有多少代码,都不执行,直接跳过进入下次循环
  8. print ("当前的i 是 %d"%i)
  9. else :
  10. print ("else 表示不满足条件时调用的代码,这时i为%d"%i)
  1. #打印等边三角形,
  2. i=int(input("请输入等边三角形的行数: "))
  3. a=0
  4. while a<i :
  5. b=0
  6. #打印当前行前面的空格,第一行不打印空格,
  7. while b<a :
  8. print (end=" ")
  9. b+=1
  10. c=i-a
  11. #打印*号,第一行打印i个*
  12. while c>0 :
  13. print ("*",end=" ")
  14. c-=1
  15. print ("")
  16. a+=1

for循环

字符串常用方法

  • name[-1] 取字符串最后一个字符,name[0]取字符串第一个字符,name[len(name)-1] 取最后一个字符
  • 前片是对操作的对象截取其中一部分的操作,字符串、列表、元组都支持切片操作
    • 包头不包尾,(和range、列表, 一样的)
    • name[0::2] 截取从第一个字符开始到最后,隔一个截取一个,所以步长是2
    • name[-1::-1] 将字符串反转,起始位省略掉就截取到字符开始位了
  • 查找字符串
    • my_str.find (“xiaobai”) 所查找字符串的第一个字符所在的下标位,my_rfind 从右向左查找
      • 找不到返回 -1
    • my_str.index, 找不到会报错,都是从左边查找,从右向左my_str.rindex
  • 分割字符串
    • my_str.split(“ “,2), 将字符串按照空格拆分开, 分成3个片段,结果中没有隔开符(空格)
      • my_str.split(“\n”) 根据换行符分割,不需要再记另一个函数了
      • name.split() 什么都不接,就是默认把常用的隔开符都隔开了
    • my_str.partition(“ “), 按照空格拆分开,并且空格也算做一个片段
  • 大小写
    • my_str.title() 将每个单词的首字母大写
    • my_str.capitalize() 将字符串的第一个字符大写
  • 字符串对齐
    • my_str.ljust(width) 左对齐,并用空格填充至长度width 的新字符串
    • my_str.rjust(width)
    • my_str.center(width)
  • 删除空白字符
    • my_str.lstrip 删除左边的空格
    • my_str.rstrip 删除右边
    • my_str.strip 删除左右两边的空格
  • “”.join(names) 将names(列表等)连接成一个字符串, “-“.join(names)
  • 查找方法说明, help(my_str.strip)

    列表

  • list 是一种有序的集合,可随时添加和删除其中的元素, [任何类型的数据]

  • lis.append(900) 在列表最后一位添加元素
    • lis.extend(names) 将names 列表的元素添加进lis 中
    • lis.insert(0,”000”) 在0号下标位插入”000” 元素
  • del names[1] 删除列表中第二个元素
    • names.pop() 只是删除列表的最后一个元素,并返回
    • names.remove(200) 删除列表中200 元素
  • names.reverse() 将列表逆置, names[-1::-1]

    • names.sort() 一定保证列表中元素是同一类型,否则报错 names.sort(reverse=True) 按照降序排序

      元组

  • 不支持修改、增加元组中的元素。只要声明好后,长度就固定了, (任何类型的数据)

    • 所以只有查,没有增删改
  • 但是元素中存在列表,就可以修改了

    • my_tuple[2][0] 元组中第3个元素是列表,进而修改列表中的第1个元素

      字典

  • 使用键和value 来存放多个值;字典中包括多个元素,每个元素都有键和value

  • d={“xiaobai”:75,”xiaohei”:80,”tom”:90}
    • d[‘xiaobai’]
  • 键是不允许重复的,出现重复后会覆盖;值可以重复
  • 没有顺序,所以不能用下标访问
  • 在不确定字典中是否存在某个键又想获取其值时,可以使用get方法,(就不会报错了)还可以设置默认值
    • addr=stus.get(‘address’), addr=stus.get(‘address’,’beijing’)
  • 新增,stus[‘address’]=’beijing’
    • 查询,stus[‘name’]
    • 删除,del stus[‘sex’], del stus删除整个字典,(clear删除字典后不会回收)
  1. 集合迭代的补充,,
  2. names=["zs","ls","ww","sl"]
  3. names2=("zss","lss","www","sll")
  4. #第一种迭代
  5. j=0
  6. print ("序号\t姓名")
  7. for i in names:
  8. j+=1
  9. print ("%d\t%s"%(j,i))
  10. print ("="*30)
  11. #第二种,enumerate 枚举,内置函数
  12. #从1开始计数
  13. for i,item in enumerate(names,1):
  14. print ("%d\t%s"%(i,item))

字典的常用函数

  • len()测量字典中,键值对的个数
  • keys() 返回一个包含字典所有元素的键的列表
    • values() 返回包含所有value 的列表
  • items() 返回一个包含所有(键、值)元组的列表

    1. #迭代字典常用方式
    2. for item in stu.items():
    3. print ("key: %s,value: %s"%item) #item就是元组
  • has_key() 如果key在字典中,返回True,否则返回false

    • 一般用in 就行, key=”name” if key in stu: print (“%s在字典中”%key)
    • if stu.has_key(key): 其实就是条件判断表达式, python3 没有

      可变类型和不可变类型

  • 可变类型:列表,字典

    • 不可变类型:数值类型,字符串,元组,
  • 在可变类型中,a+=b <> a=a+b
    • a=[1,2] b=a b+=[3,4] 此时,原来的列表会变成[1,2,3,4]
      • 因为a和b都指向一个内存地址
    • b=b+[3,4] 先执行= 右边的表达式,完后赋值给b,b就指向一个新的列表了,所以a 还是之前的列表
    • id(a) 可以查看到引用
  • 可变类型:值可以修改(内存地址不变,但是所保存的值变化了),引用可以修改(变量的内存地址变化了)
    • = 赋值符号,作用就是将引用改了
    • 不可变类型:
运算符 结果 描述 支持的数据类型
+ [1,2,3,4] 合并 字符串、列表、元组
* [‘ab’,’ab’,’ab’,’ab’] 复制 字符串、列表、元组
in True 元素是否存在 字符串、列表、元组、字典
not in True 元素是否不存在 字符串、列表、元组、字典

函数

  • 提高代码利用率
  • 不带参数的: def 函数名(): pass
  • 带参数的: def 函数名(形参1,形参2.。。) #形参1:名字随便取,不需要之前声明,也不会和之前定义的参数冲突(局部变量) ```python def test2(a,b): sum=a+b return sum

    return 被执行之后,不管return后面还有什么代码,都不会执行

    a=1 b=1 sum=test2(a,b) print (“%s和%s的和为:%s”%(a,b,sum))

def test2_noretu(a,b): sum=a+b s=test2_noretu(a,b) print (s)

def test1(r): s=3.14(r*2) print (“面积为:%s”%s)

r=11.8 test1(r)

  1. ```python
  2. def sum_plus(a,b):
  3. if not isinstance(a,(int,float)):
  4. print ("传入的a是%s,不是一个数字类型,方法结束"%a)
  5. return#如果a不是一个数字,函数后面的代码没有必要执行
  6. elif not isinstance(b,(int,float)):
  7. print ("传入的b是%s,不是一个数字类型,方法结束"%b)
  8. return # 什么都不接,表示返回值为none
  9. sum=a+b
  10. return sum
  11. s=sum_plus(21,2)
  12. print (s)
  1. def avg_3num(a,b,c):
  2. if is_num(a) and is_num(b) and is_num(c): #执行代码从上往下执行,但是函数里面的代码是不执行的
  3. #,不执行def下面的,只是内存中加载了这个函数。在后面 = 赋值时调用函数时才开始执行函数里面的代码
  4. return (a+b+c)/3
  5. else:
  6. print ("没法计算平均值")
  7. def is_num(a):
  8. if not isinstance(a,(int,float)):
  9. print ("传入的实参是%s,不是一个数字类型,方法结束"%a)
  10. return False
  11. else:
  12. return True
  13. avg=avg_3num("abc",2,3)
  14. print (avg_3num)
  • test1 函数的局部变量,结尾加个 return a ,然后在test2 函数中, b=test1() 就可以取到test1 中的局部变量a 的值
    • 如果函数中的局部变量和全局变量的名字一样,优先使用局部变量
    • 在函数内使用 a=20 , 是定义了一个局部变量,要想更改全局变量,在代码上一行加 global a
  • 在函数中修改全局变量:
    • 如果是可变类型可以执行修改变量的值,
    • 想要在函数中修改不可变类型的全局变量,本质上是修改不可变类型的引用,(加上global)
  • 全局变量的定义放在调用函数之前就OK

    参数

  • 缺省参数,带有默认值的参数一定要位于参数列表的最后面

  • 不定长参数, sum 以元组存储后面的参数 ```python def test1(x,y,*args): print (x,y) print (args) sum=x+y for i in args:
    1. sum+=i
    print (“和为:%s”%sum)

def test2(x,args,*kwargs): #keyword指带有名字的参数 print (x) print (args) print (kwargs) sum=x for i in args: sum+=i for i in kwargs.values(): sum+=i print (“和为:%s”%sum)

test1(2,3,4,5,6,7)

test2(2,3,4,num1=5,num2=6)

集合的拆包

nums=[3,4] nums2={“num1”:5,”sdfs”:6} test2(2,nums,*nums2)

  1. <a name="VBRnr"></a>
  2. ### 学生管理系统
  3. ```python
  4. def print_menu():
  5. print ("="*30)
  6. print ("学生管理系统".center(20))
  7. print ("输入1:添加学生")
  8. print ("输入2:查找学生")
  9. print ("输入3:修改学生")
  10. print ("输入4:删除学生")
  11. print ("输入5:查看所有学生")
  12. print ("输入6:退出")
  13. def add_student():
  14. name=input ("请输入学生的姓名:")
  15. age=int(input("请输入学生的年龄:"))
  16. qq=input ("请输入学生的QQ号:")
  17. #一个学生包括三个信息,这三个信息存在一个字典中
  18. stu={}#声明一个字典变量
  19. stu["name"]=name #向字典中添加一个key
  20. stu["age"]=age #向字典中添加一个key
  21. stu["qq"]=qq #向字典中添加一个key
  22. stus.append(stu)
  23. print ("添加成功")
  24. def search_student(name):
  25. for item in stus:
  26. if item["name"]==name.strip():
  27. print ("%s 学生存在"%name)
  28. print_student(item)
  29. #break
  30. return item #同样可以终止循环
  31. else:
  32. #break是整个循环终止,不会执行else
  33. print ("学生%s没有找到"%name)
  34. def del_student(name):
  35. student=search_student(name)
  36. stus.remove(student)
  37. def print_student(item):
  38. print ("%s\t%s\t%s"%(item["name"],item["age"],item["qq"]))
  39. def print_all_student():
  40. print ("序号\t姓名\t年龄\tQQ号")
  41. for i,item in enumerate(stus,1):
  42. print ("%s\t"%i,end="")
  43. print_student(item)
  44. #一个学生包含很多信息,一个学生一个字典,学生列表用列表存储
  45. def main():
  46. print_menu()
  47. while True:
  48. operate=input ("请输入你想要的操作:")
  49. if operate=="1":
  50. add_student()
  51. if operate=="2":
  52. name=input ("请输入要查找学生的姓名:")
  53. search_student(name)
  54. if operate=="3":
  55. pass
  56. if operate=="4":
  57. name=input ("请输入要删除学生的姓名:")
  58. del_student(name)
  59. if operate=="5":
  60. print_all_student()
  61. if operate=="6":
  62. break
  63. stus=[]#全局变量
  64. main()

递归函数

  • 如果一个函数在内部调用自身,这个函数就是递归函数
    • 本质上是一个方法的循环调用,注意有可能出现死循环
    • 一定要定义递归的边界(什么时候退出循环)
  • 比方说阶乘

    1. def test1(n):
    2. if n==1:
    3. return 1
    4. return n * test1(n-1)
    5. print (test1(4))
  • 斐波拉切数列

    1. def test(n):
    2. if n==1 or n==2:
    3. return 1
    4. else:
    5. return test(n-1)+test(n-2)
    6. #n=int(input("请输入需要求的数字:"))
    7. #print(test(n))
    8. n=[]
    9. for i in range(1,20):
    10. n.append(test(i))
    11. print (n)

  • 但是,这样来看F(n) 要计算很多复杂的值,时间复杂度为O(2^n),2的n次方。下面的非递归的时间复杂度是O(n) ```python

    !/usr/bin/env python

    -- coding:utf-8 --

def fibonacci(n): if n == 0: return 0 elif n <= 2: return 1 else: num1 = 1 num2 = 1 for i in range(2,n-1): num1,num2 = num2,num2 + num1 return num1 + num2 print(fibonacci(100)) ```