python基础语法学习二

目录

1.空行

2.一行书写多语句

3.代码组

4.print

5.模块

5.1.搜索路径

5.2

5.3__name__属性

5.4标准模块

5.5包

6.if语句

7.循环语句

7.1while语句

7.2for语句 

7.3range()

7.4pass 语句

8.迭代器与生成器 

8.1迭代器

 8.2生成器

9.函数

9.1.格式: 

9.2.python 函数的参数传递:

9.3.参数

9.4.匿名函数


1.空行

函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。

2.一行书写多语句

Python 可以在同一行中使用多条语句,语句之间使用分号 ; 分割

#代码1
import sys; x = 'runoob'; sys.stdout.write(x + '\n')

#代码2
import sys
 x = 'runoob';
sys.stdout.write(x + '\n')


#以上两代码等价

3.代码组

···代码组相当于代码块

缩进相同的一组语句构成一个代码块,我们称之代码组。

像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。

我们将首行及后面的代码组称为一个子句(clause)。

#子句开始
if requested_toppings:
#代码块开始
	for requested_topping in request_toppings:
		if requested_topping == 'green peppers':
			print("Sorry, we are out of green peppers right now.")
		else:
			print("Adding "+requested_topping+".")
	print("\nFinished making your pizza!")
#代码块结束
#子句结束
else:
	print("Are you sure you want a plain pizza?\n")

4.print

关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符

print(1,end="");print(2,end="")
print()

print(1,end=" ");print(2,end=" ")
print()

print(1,end=",");print(2,end=",")

#输出结果
'''
12
1 2 
1,2,
'''

5.模块

模块是一个包含已经定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。

可以自己编写一个模块,也可以引用标准库中的模块。

>>> import random
>>> random.random()
0.2419781054363922

上述代码在第一行引入了random模块,并使用了random模块的random函数。

引入random模块,实际上是引入了random.py文件。

在 python 用 import 或者 from...import 来导入相应的模块。

将整个模块(somemodule)导入,格式为: import somemodule

从某个模块中导入某个函数,格式为: from somemodule import somefunction

从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc

将某个模块中的全部函数导入,格式为: from somemodule import *

5.1.搜索路径

当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?搜索路径是在Python编译或安装的时候确定的,搜索路径被存储在sys模块中的path变量。

在交互式命令行中执行代码A 

>>> import sys
>>> sys.path

输出结果为

 ['',

'E:\\software\\python3.7.8\\python37.zip',

'E:\\software\\python3.7.8\\DLLs',

'E:\\software\\python3.7.8\\lib',

'E:\\software\\python3.7.8',

'E:\\software\\python3.7.8\\lib\\site-packages']

 以脚本的方式执行下列代码A,(脚本存放在桌面中)

输出结果为

['C:\\Users\\DELL\\Desktop',

'E:\\software\\python3.7.8\\python37.zip',

'E:\\software\\python3.7.8\\DLLs',

'E:\\software\\python3.7.8\\lib',

'E:\\software\\python3.7.8',

'E:\\software\\python3.7.8\\lib\\site-packages']

可见,当代码以脚本的方式执行时,搜索路径的第一个路径是脚本所在目录。

5.2

若要经常使用random函数,有三种方式可以简化调用方式

1.

from random import random
>>> random()

2.

>>> import random
>>> rand = random.random
>>> rand()

3.

 >>> import random
>>> rand = random.random()
>>> rand

 5.3__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。

如果我们想在模块被引入时,主程序的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。

定义test.py文件

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

 运行该脚本文件 

python C:\Users\DELL\Desktop\test.py

输出结果

程序自身在运行 

在交互式命令行中引入test文件 

>>> import test
我来自另一模块

 __name__ 与 __main__ 底下是双下划线

 5.4标准模块

有些模块直接被构建在解析器里,这些组件会根据不同的操作系统进行不同形式的配置,比如 winreg 这个模块就只会提供给 Windows 系统。

应该注意到这有一个特别的模块 sys ,它内置在每一个 Python 解析器中。变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps1 = '-->'
-->pass
-->
-->

5.5包

 目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包。

6.if语句

if语句格式如下

if condition_1:        #等价于if(condition_1):

        statement_block_1          #注意缩进

elif condition_2:

        statement_block_2

else:

        statement_block_3

Python中没有switch – case语句 

非零就是true,但此说法只应用在判断条件中

if中常用的操作符

#数字猜谜游戏
number = 7
guess = -1    #guess的值-1是没用的。但若不对guess赋值,将会报错
print("数字猜谜游戏!")
while guess != number:
    guess = int(input("请输入你猜的数字:")) #input接收输入
 
    if guess == number:
        print("恭喜,你猜对了!")
    elif guess < number:
        print("猜的数字小了...")
    elif guess > number:
        print("猜的数字大了...")

7.循环语句

7.1while语句

while 判断条件:#注意冒号
    执行语句……#注意缩进

在 Python 中没有 do..while 循环

1.无限循环 

while 1 :

 print(“无限循环”)

程序进入无限循环时,ctrl+c即可终止

2.while else

while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>

如果 while 后面的条件语句为 false 时,则执行 else 的语句块 

7.2for语句 

Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。

for <variable> in <sequence>:

        <statements>

else:

         <statements>

 7.3range()

如果你需要遍历数字序列,可以使用内置range()函数,它会生成数列。

range(最小数字i,最大数字j,步长)

三个参数后两个是可选的,生成的数字范围取i不取j。 

1.使用range函数创建列表

>>>list(range(5))

[0, 1, 2, 3, 4]

list(seq) 是函数,目的是将元组转化为列表

7.4pass 语句

Python pass是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句

>>>while True:

...         pass # 等待键盘中断 (Ctrl+C)

8.迭代器与生成器 

8.1迭代器

迭代器有两个基本的方法:iter() 和 next()

字符串,列表或元组对象都可用于创建迭代器。

1.遍历迭代器对象

可以用for循环遍历

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

执行结果

1 2 3 4

也可以用next()函数遍历

import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        break

2. StopIteration

StopIteration 异常用于标识迭代的完成

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

上述语句的for循环中,终止条件是遭遇 StopIteration异常。

可以通过自建迭代器进一步感悟。

3.创建迭代器

已经知道,字符串,列表,元组可用于创建迭代器。

想要让类也可用于创建迭代器,需要在类中实现两个方法 __iter__() 与 __next__() 。

__iter__() 定义迭代初始情况, __next__() 定义每次迭代产生的元素。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

再给出一个示例

class MyIter():
  def __init__(self):
    #为了示例,用一个简单的列表作为需迭代的数据集合,并且私有化可视情况变为其他类型集合
    self.__list1=[1,2,3,4]
    self.__index=0

  def __iter__(self):
    #该魔法方法,必须返回一个迭代器对象,如果self已经定义了__next__()魔法方法,则只需要返回self即可
    #因为如上面所述,生成器一定是迭代器
    return iter(self.list1)    

  def __next__(self):
    #此处的魔法函数,python会自动记忆每次迭代的位置,无需再使用yield来处理
    #在使用next(obj)时,会自动调用该魔法方法
    res=self.__list1[self.__index]
    self.__index+=1
    return res

 8.2生成器

生成器比自定义迭代器类更加常用。

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

生成器是一个返回迭代器的函数。

yield有点像断点。     加了yield的函数,每次执行到有yield的时候,会返回yield后面的值 并且函数会暂停,直到下次调用或迭代终止;

使用 yield的斐波那契函数:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

 当斐波那契的参数十分大时,若想要将a所有值作为列表返回,十分消耗内存。

使用了yield的函数,返回的仅仅是一个迭代器,while循环每次执行next()时,fibonacci函数才会调用一次,得到a新的值,节省了内存。

迭代器和生成器具体应用场景,就凡是需要提升运行效率或节约内存资源,且遍历的数据是集合形式的,都可以考虑。

另外一个小众的使用场景,是变相实现协程的效果,即在同一个线程内,实现不同任务交替执行

9.函数

9.1.格式: 

def 函数名(参数列表):  #注意冒号
    函数体              #注意缩进  

 函数以return表达式结束,若无return,则表面返回none

9.2..python 函数的参数传递:

  • 不可变类型参数传递:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。

  • 可变类型参数传递:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

9.3.参数

函数参数的类型有

  • 必需参数

  • 关键字参数

  • 默认参数

  • 不定长参数

以printinfo函数为例

def printinfo( name, age ):
   "打印任何传入的字符串"
   print ("名字: ", name)
   print ("年龄: ", age)
   return

(1)调用该函数时,使用必需参数:

printinfo("lihua",25)

(2) 调用该函数时,使用关键字参数:

printinfo(age=25,name="lihua")

使用关键字参数允许函数调用时参数的顺序与声明时不一致

(3)调用该函数时,使用默认参数:

对printinfo函数作出修改,对age参数赋默认值

def printinfo( name, age=25 ):
   "打印任何传入的字符串"
   print ("名字: ", name)
   print ("年龄: ", age)
   return

调用函数: 

printinfo("lihua")

 (4)不定长参数

定义如下函数

>>>def f(a,*b):
...  print(a)
...  print(b)
>>> f(1,2,3,4,"xxx")#调用函数

#打印结果
'''
1
(2, 3, 4, 'xxx')
'''

 参数b是不定长参数,它表示一个元组,元组可以为空。这样,调用函数时可以传入不定长参数。

若*单独出现

>>>def f(a,*):
...  print(a)
...  print(b)

表面该参数为一个元组,不能为空

若b前有两个*

>>>def f(a,**b):
...  print(a)
...  print(b)

表明b参数为一个字典 

9.4.匿名函数

Python 使用 lambda 来创建匿名函数,lambda 函数的语法只包含一个语句

设置参数 a 加上 10:

x = lambda a : a + 10  

调用函数

print(x(5)) 

输出结果

 15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值