IDE : 集成开发环境(pycharm,vscode等)
python通过缩进来分段的,spyder默认了一个Tab是4个空格,每4个空格就相当于一个{
python中无switch,可以用字典或者if…elif…elif…elif…的方式代替switch
# if True:
# pass#空语句/占位语句
print('please input a :')
#a=input()
#这个a其实是字符串
#因为python是一种动态语言,不提前声明变量类型!而且不报错!
a=int(input())
if a==1:
print('apple')
elif a==2:
print('banana')
elif a==3:
print('orange')
else:
print('shopping')
#主要用来遍历/循环 序列/集合/字典
# =============================================================================
# a=[['apple','orange','banana','grape'],(1,2,3)]
# for x in a:
# for y in x:
# if y == 'orange':
# break
# print(y)
# # print(y,end=' ')#默认是竖着输出的,加end就横着输出了
# else:
# print('T^T fruit has gone')
# =============================================================================
#a=[1,2,3]
#
#for x in a:
# if x==2:
# break#直接跳出循环,以后也没了
## continue#跳出本次循环,进行下一次循环
# print(x)
#else:
# print('EOF')
# =============================================================================
# for x in range(0,10,2):
# print(x,end=' | ')
# for y in range(10,0,-2):
# print(y,end=' | ')
# =============================================================================
a=[1,2,3,4,5,6,7,8]#输出1,3,5,7
#for x in range(0,len(a),2):
# print(a[x])
b=a[0:len(a):2]
print(b)
# -*- coding: utf-8 -*-
'''这是我的第一个python程序~
print('hello python')'''
# =============================================================================
# 一段小程序
# =============================================================================
ACCOUNT='qubo'
PASSWORD='0000'
flag=0#标记输入是否完全正确,
while flag==0:
print('please input account')
user_account=input()
print('please input password')
user_password=input()
# =============================================================================
# if ACCOUNT==user_account :
# if PASSWORD==user_password:
# print('loading--successfully!')
# else:
# print('wrong password!')
# else:
# print('wrong account!')
# =============================================================================
if ACCOUNT==user_account and PASSWORD==user_password:
print('loading--successfully!')
flag=1
else:
print('wrong password or account!')
包和模块
spyder在新建工程后,建包和模块的区别在新建时就可以体现
建包:
_init_.py本身就有
圈起来的为自动生成的自解码(字节码?)文件,貌似调用一次包就会生成一个(有待我考证)…
test1,test2,test3均为模块,只不过test3和test1,test2不在一个包(即文件夹)中,不在同一个包中的模块可以重名。
#引入包方法1
import pkg1.test1 as m#导入模块
print(m.a)
#引入包方法2
from pkg1.test1 import a#导入具体变量
print(a)
#也可运行
from pkg1 import test1
print(test1.a)
代码一行太长了可以通过()来换行,或者末尾加 \ (不推荐)
关于_init_.py文件
#可以用来初始化、引入多个公用的包
#不论是引用_init_.py文件所在的包还是同级文件
#均自动执行
#__all__=['test1']#限制使用哪几个模块
print('this is init file')
python中一旦导入某个模块,就会执行该模块的代码,如:
f1.py
a=1
f2.py
b=2
print(b)
f3.py
from f2 import b
run f3.py 结果:
包和模块是不会重复导入的,避免循环引用包
函数
特点:
- 功能性
- 隐藏细节
- 避免编写重复代码
显示python之禅:命令行输入 import this
函数无return的话默认返回None
python一行一行的执行代码
必须参数、关键字参数、默认参数
# -*- coding: utf-8 -*-
def damage(skill1,skill2):
damage1=skill1+1
damage2=skill2*3
return damage1,damage2
#序列解包
skill1_damage,skill2_damage=damage(1,2)
print(skill1_damage,skill2_damage)
#关键字参数--增强代码可读性--可以不尊重顺序
s1,s2=damage(skill2=3,skill1=5)
#默认参数,直接给形参赋值,用于大部分信息都相同的情况
#不一样信息的按照必须参数的样式直接传值
#定义函数、调用函数时必须参数必须在前面,默认参数必须要跟在最后面
#如果要在一堆默认参数中指定一个值,用关键字参数赋值!
类
#类的最基本的作用就是封装
class Student():
name='小黑'
age=0#类变量
#行为与特征(方法与变量)
#类变量 vs 实例变量
def __init__(self,name,age):#构造函数,实例化时自动调用,只能返回None
#初始化对象特征
self.name=name#这个self可以任意改名,但必须有,建议用self,代表实例
self.age=age#self.age是实例变量
# print(type(self))
stu1=Student('小明',18)#类的实例化,不需要new
print(stu1.name,stu1.age)
实例方法、类方法、静态方法
# -*- coding: utf-8 -*-
#类的最基本的作用就是封装
class Student():
sum=0
name='小黑'
age=0
def __init__(self,name,age):#构造函数,实例化时自动调用,只能返回None
self.name=name#这个self可以任意改名,但必须有,建议用self,代表实例
self.age=age#self.age是实例变量
def do_homework(self):#实例方法
print(self.name+' do homework')
@classmethod#装饰器
def plus_sum(cls):#类方法,可同时被对象和类调用
cls.sum+=1
print(cls.sum)
@staticmethod#静态方法,可同时被对象和类调用 ,尽量不用
def add(x,y):
print('this is a static method~')
stu1=Student('小明',18)
Student.plus_sum()
stu1.add(1,2)
Student.add(1,2)
#stu2=Student('小花',18)
#Student.plus_sum()
给方法前加__(双下划线),python认为是私有的(private)
构造函数(_init_)除外,因为后面还有__ ~~~~小tips
class Student():
sum=0
def __init__(self,name,age):
self.name=name
self.age=age
self.__score=0#__代表是私有的属性,python就会创建一个叫做_Student__score的属性,而并不是我们以为的__score
def marking(self,score):
if score<0:
return'不能给别人评负分'
self.__score=score
print(self.name+"本次考试分数为:"+str(self.__score))
def do_homework(self):
self.do_english_homework
print(self.name+' do homework')
def do_english_homework(self):
pass
@classmethod
def plus_sum(cls):
cls.sum+=1
print(cls.sum)
@staticmethod
def add(x,y):
print('this is a static method~')
stu1=Student('小明',18)
stu2=Student('小花',18)
#Student.plus_sum()
result=stu1.marking(59)
stu1.__score=1#利用python动态属性,添加了一个新的实例变量__score,但其实本来是没有这个变量的
#print(stu1.__score)#不报错
print(stu1.__dict__)
#print(stu2.__score)#报错
print(stu2.__dict__)
结果:
如果print(stu2.__score)
通过__dict__查看两个对象内部的具体值的情况:
python对私有变量的保护机制:_Student__score为init函数初始化时真正的属性值,而__score为python检测到我要给这个东西赋值,自己动态加的一个变量…(其实就是把原来私有变量的名字给改了)
继承
父类:
class Humen():
sum=0
def __init__(self,name,age):
self.name=name
self.age=age
def get_name(self):
return (self.name)
def do_homework(self):
print('this is parent method!')
子类:
from t2 import Humen
class Student(Humen):#继承
def __init__(self,school,name,age):
self.school=school
#Humen.__init__(self,name,age)#不加self报错
#类调用实例方法,和本质初始化是不一样的
#缺点:当要换父类时,所有原父类名字都要改(开闭原则)
super(Student,self).__init__(name,age)#优先考虑用super
def do_homework(self):#实例方法
super(Student,self).do_homework()
print(self.name+' do homework')
stu1=Student('喵喵小学','小花',20)
stu1.do_homework()
结果: