Python基础语法

Python基础-01

1.1 注释

注: 以下示例代码均以python3为主,若有python2代码 会说明

单行注释: 以#开头,#右边的所有东西当做说明

    #我是注释,可以在里写一些功能说明之类的哦
    print('hello world')

多行注释:

    '''
            我是一个
            多行注释
            额额额额
    '''
    print("这个就是多行注释!")

但是如果你用的是python2,注意要让程序支持中文:

要加上#coding=utf-8,且=号两边不能有空格

    #coding=utf-8
    #我是phython2
    print 'python2版本'
1.2 变量及类型

标准数据类型

Python3中有六个标准的数据类型:

  • Number(数字)

  • String(字符串)

  • List(列表)

  • Tuple(元祖)

  • Set(集合)

  • Dictionary(字典)

    **不可变数据(3个): **Number(数字)、String(字符串)、Tuple(元组);

    可变数据(3个): List(列表)、Dictionary(字典)、Set(集合)。


1.2.1Number(数字)

Python3 支持 int 、float、bool、complex(复数)

Python3 中,只有一种整数类型 int , 表示为长整型, 没有python2 中的 Long。

内置的 type() 函数可以用来查询变量所指的对象类型

>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>

此外还可以用 isinstance 来判断:

>>>a = 111
>>> isinstance(a, int)
True
>>>

其中 isinstancetype 的区别在于:

class A:
    pass

class B(A):
    pass

isinstance(A(), A)  # returns True
type(A()) == A      # returns True
isinstance(B(), A)    # returns True
type(B()) == A        # returns False

区别就是:

  • type()不会认为子类是一种父类类型。

  • isinstance()会认为子类是一种父类类型。

当你指定一个值时, Number 对象就会被创建:

var1 = 1
var2 = 10

您也可以使用 del 语句删除一些对象引用。例如:

del var
del var_a, var_b

数值运算:

>>>5 + 4  # 加法
9
>>> 4.3 - 2 # 减法
2.3
>>> 3 * 7  # 乘法
21
>>> 2 / 4  # 除法,得到一个浮点数
0.5
>>> 2 // 4 # 除法,得到一个整数
0
>>> 17 % 3 # 取余 
2
>>> 2 ** 5 # 乘方
32

1.2.2 String(字符串)

Python中的字符串用单引号 ’ 或者 ” 括起来,同时使用 \ 转义特殊字符。

同时,加号 + 是字符串的连接符, 星号 * 表示复制当前字符串,紧跟的数字为复制的次数。

字符串输出:

#Python3
>>>a="中国"
>>>b=2
>>>print("我很%d,但是我爱%s"%(b,a),end="")
>>>print(" -署名Jack")
我很2,但是我爱中国 -署名Jack

#Python2
>>>#coding=utf-8
>>>a="中国"
>>>b=2
>>>print"我很%d,但是我爱%s"%(b,a),
>>>print" -署名Jack"
我很2,但是我爱中国  -署名Jack

注意:常用 %d格式化整数%s格式化字符串,不换行打印加上 end=”” (python3), 如果为python2 如上 加上 即可

字符串输入 :

input 能够帮你完成从键盘中获取数据,然后保存到指定的变量中

注意: input获取的数据,都是以字符串的形式进行保存,即使输入的是数字,那么也是以字符串的形式进行保存

#Python3
>>>username = input("请输入用户名:")
>>>print("当前的用户名为:%s"%username)

#Python2
>>>#coding=utf-8
>>>username = raw_input("请输入您的用户名:")
>>>print "您的用户名为:%s"%username

字符串的下标与切片:

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作

切片的语法: [起始:结束:步长]

选取的区间属于左闭右开型,即从“起始”位开始,到 “结束” 位的前一位结束 (不包括结束位本身)

 >>> a = "abcdef"
 >>> a[:3]
 'abc'
 >>> a[::2]
 'ace'
 >>> a[5:1:2] 
 ''
 >>> a[1:5:2]
 'bd'
 >>> a[::-2]
 'fdb' 
 >>> a[5:1:-2]
 'fd'

字符串的常见操作:

<1> find

检测str是否包含在mystr中,如果是返回开始的索引值,否则返回 -1

用法:

mystr.find(str, start=0, end=len(mystr))

示例:

mystr='hello world Jack and JackSmith'
num = mystr.find('Jack')
print(num)
>>> 12

mystr='hello world Jack and JackSmith'
num = mystr.find('Jack',0,10)
print(num)
>>> -1

<2> index

跟 find() 方法一样, 只不过如果str不在mystr中会报一个异常

用法:

mystr.index(str, start=0, end=len(mystr))

示例:

mystr='hello world Jack and JackSmith'
num = mystr.index('Jack')
print(num)
>>> 12

mystr='hello world Jack and JackSmith'
num = mystr.index('Jack',0,10)
print(num)
>>> Traceback (most recent call last):
  File "pythonFile.txt", line 2, in <module>
    num = mystr.index('Jack',0,10)
ValueError: substring not found

<3> count

返回str在 start和end之间 在mystr里面出现的次数

用法:

mystr.count(str, start=0, end=len(mystr))

示例:

mystr='hello world Jack and JackSmith'
num = mystr.count('Jack')
print(num)
>>> 2

<4> replace

把 mystr 中的 str1 替换成 str2,如果 count 指定,则替换不超过 count 次.

用法:

mystr.replace(str1, str2,  mystr.count(str1))

示例:

name='helloworld ha ha'
newName = name.replace('ha','HA',1)
print("name=%s"%name)
print("newName=%s"%newName)
>>> name=helloworld ha ha
>>> newName=helloworld HA ha

<5> split

以 str 为分隔符切片 mystr,如果 maxsplit有指定值,则仅分隔 maxsplit 个子字符串

用法:

mystr.split(str=" ", 2)

示例:

name='hello world ha ha'
newName1 = name.split(" ")
print(newName1)
newName2 = name.split(" ",2)
print(newName2)
>>> ['hello', 'world', 'ha', 'ha']
>>> ['hello', 'world', 'ha ha']

<6> capitalize

把字符串的第一个字符大写

用法:

mystr.capitalize()

示例:

mystr='hello world jack and bao'
newStr = mystr.capitalize()
print (newStr)
>>> Hello world jack and bao

<7> startswith

检查字符串是否是以 obj 开头, 是则返回 True,否则返回 False

用法:

mystr.startswith(obj)

示例:

1.4 函数

用法:

    def 函数名():
        代码

示例:

#定义函数
def printInfo():
        print('--------------')
        print('人生苦短 我用python')
        print('--------------')
#调用函数
printInfo()
>>> --------------
>>> 人生苦短 我用python
>>> --------------
1.4.1 函数的文档说明
def calculate(a,b):
        "该函数用来完成对两个数进行求和"
        print("a+b=%d"%(a+b))
calculate(1,2)
>>> a+b=3

help(calculate)
>>> Help on function calculate in module __main__:
>>> calculate(a, b)
>>>  该函数用来完成对两个数进行求和
(END) 

调用函数时,参数的顺序:

def addSum(a,b):
        print("a(%s)+b(%s)的和等于%d"%(a,b,a+b))
addSum(2,3)
>>> a(2)+b(3)的和等于5


def addSum(a,b):
        print("a(%s)+b(%s)的和等于%d"%(a,b,a+b))
addSum(b=3,a=2)
>>> a(2)+b(3)的和等于5
1.4.2 函数的返回值

在python 中我们可不可以返回多个值?

def divide(a,b):
        shang=a//b
        yushu=a%b
        return shang,yushu
sh,yu=divide(9,2)
print("a除b的商:%s,余数:%s"%(sh,yu))
>> a除b的商:4,余数:1

本质上利用了元组

1.4.3 局部变量和全局变量

如果在函数中修改全局变量,那么就需要使用 global 进行声明,否则出错

如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的

对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量

对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量

python中交换 2个 变量的几种方式:

a=4
b=5

#第一种
c=a
a=b
b=c

#第二种
a=a+b
b=a-b
a=a-b

#第三种
a,b=b,a

其他知识点扩充:

# 1
a=[100]
def test(num):
        num+=num
        print(num)
test(a)
print(a)
>>> [100, 100]
>>> [100, 100]

# 2
a=[100]
def test(num):
        num=num+num
        print(num)
test(a)
print(a)
>>> [100, 100]
>>> [100]

1.4.4 函数参数

<1> 缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入

def printinfo( name, age = 35 ):
   # 打印任何传入的字符串
   print "Name: ", name
   print "Age ", age

# 调用printinfo函数
printinfo(name="miki" )
printinfo( age=9,name="miki" )
>>> Name:  miki
>>> Age  35
>>> Name:  miki
>>> Age  9

注意:带有默认值的参数一定要位于参数列表的后面

>>> def printinfo(name, age=35, sex):
...     print name
...
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

<2> 不定长参数

加了星号()的变量args会存放所有未命名的变量参数,args为元组;而加*的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典。

def test(a,b,c=33,*args,**kwargs):
        print(a)
        print(b)
        print(c)
        print(args)
        print(kwargs)
test(1,2,44,55,name='张三',age=19)
>> 1
>> 2
>> 44
>> (55,)
>> {'name': '张三', 'age': 19}

注意:若元组只有单个元素,要在此单个元素后加个表区分 是个元组,否则python解释器会把其当成一个算数表达式

<3> 拆包

若实参中 使用 * 表示拆元组,使用 ** 表示拆字典

def test(a,b,c=33,*args,**kwargs):
        print(a)
        print(b)
        print(c)
        print(args)
        print(kwargs)
#test(1,2,44,55,name='张三',age=19)
A=(44,55,66)
B={'name':'张三','age':19}
test(1,2,3,*A,**B)
>> 1
>> 2
>> 3
>> (44, 55, 66)
>> {'name': '张三', 'age': 19}
1.4.5 匿名函数

用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

案例:排序

infos=[{'name':'Jack','age':19},{'name':'Smith','age':20},{'name':'David','age':25}]
infos.sort()
print(infos)
#直接排序会报错 因为解释器无法判别 是按名称还是年龄排序 所以接下来需要进行指定
>>> Traceback (most recent call last):
>>>  File "01-test.py", line 2, in <module>
>>>    infos.sort()
>>> TypeError: '<' not supported between instances of 'dict' and 'dict'

使用lambda进行指定,排序规则

infos=[{'name':'Jack','age':19},{'name':'Smith','age':20},{'name':'David','age':25}]
infos.sort(key=lambda x:x['name'])
print(infos)

>>> [{'name': 'David', 'age': 25}, {'name': 'Jack', 'age': 19}, {'name': 'Smith', 'age': 20}]

匿名函数当作实参的应用:

python2:

#coding=utf-8
def calcu(a,b,func):
        result = func(a,b)
        return result
func_new=input("请输入计算规则: ")
result=calcu(11,12,func_new)
print result

>>> 请输入计算规则: lambda x,y:x*y
>>> 132

python3:(python3中的input会把输入的内容当作字符串处理 所以要用eval 将字符串转换成表达式)

def calcu(a,b,func):
        result=func(a,b)
        return result
func_new = input("请输入计算规则:")
func_new = eval(func_new)
print(calcu(11,12,func_new))

>>> 请输入计算规则:lambda x,y:x-y
>>> -1
1.5 文件

文件的复制、粘贴

1.6 面向对象

定义一个类:

class 类名:
    函数列表

综合案例:

class cat:
        """定义了一个cat类"""

        #初始化对象
        def __init__(self,new_name,new_age):
                self.name=new_name
                self.age=new_age

        def __str__(self):
                return "%s的年龄是%d"%(self.name,self.age)
        #方法
        def eat(self):
                print("%s在吃鱼..."%self.name)
        def drink(self):
                print("%s在喝水..."%self.name)
#创建一个对象
tom=cat("汤姆猫",16)
tom.eat()
print(tom)
smith=cat("咖菲猫",1)
smith.drink()
print(smith)
>>> 汤姆猫在吃鱼...
>>> 汤姆猫的年龄是16
>>> 咖菲猫在喝水...
>>> 咖菲猫的年龄是1

注:

  • 创建完对象 __init__默认执行
  • 在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
  • 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数剧

__del__() 方法

由上可知,python解释器默认调用 __init__()方法

当删除一个对象时,python解释器也会默认调用一个方法,这个方法为 __del()__方法

import time
class Animal(object):
        #初始化方法
        #创建完对象后会自动被调用
        def __init__(self,name):
                print("__init__方法被调用")
                self.__name=name
        #析构方法
        def __del__(self):
                print("__del__方法被调用")
                print("%s对象马上被干掉了..."%self.__name)
#创建对象
dog = Animal("哈皮狗")
#删除对象
del dog

cat = Animal("波斯猫")
cat1 =cat
print("马上删除cat对象")
del cat
print("马上删除cat1对象")
del cat1
print("程序两秒后结束")
time.sleep(2)

这里写图片描述

1.6.1 封装与隐藏

Python中没有像C++中public和private这些关键字来区别公有属性和私有属性

它是以属性命名方式来区分,如果在属性名前面加了2个下划线__,则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)

为了更好的保存属性安全,即不能随意修改,一般的处理方式为

  • 将属性定义为私有属性
  • 添加一个可以调用的方法,供调用
class People(object):
        def __init__(self,name):
                self.__name=name
        def getName(self):
                return self.__name

        def setName(self,newName):
                if len(newName) >= 5:
                        print("newName的长度:%s"%(len(newName)))
                        self.__name = newName
                else:
                        print("error:名字长度需要大于或者等于5")
xiaoming = People("haha")
print(xiaoming.getName())
xiaoming.setName("SmithDavid")
print(xiaoming.getName())
>>> haha
>>> newName的长度:10
>>> SmithDavid
  • 私有的属性,不能通过对象直接访问,但是可以通过方法访问
  • 私有的方法,不能通过对象直接访问
  • 私有的属性、方法,不会被子类继承,也不能被访问
  • 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
1.6.2 继承

即一个派生类(derived class)继承基类(base class)的字段和方法

单继承-示例:

# 定义一个父类,如下
class Cat(object):
        def __init__(self,name,color="白色"):
                self.name = name
                self.color = color
        def run(self):
                print("%s--跑啊跑"%self.name)
#定义一个子类
class Bosi(Cat):
        def setNewName(self,newName):
                self.name=newName
        def eat(self):
                print("%s--在吃呀吃"%self.name)
bs = Bosi("波斯猫")
print("bs的名字:%s"%bs.name)
print("bs的颜色:%s"%bs.color)

bs.eat()
bs.setNewName("波斯花花猫")
bs.run()
>>> bs的名字:波斯猫
>>> bs的颜色:白色
>>> 波斯猫--在吃呀吃
>>> 波斯花花猫--跑啊跑

说明:

虽然子类没有定义__init__方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__方法

多继承-示例:

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值