xml地图|网站地图|网站标签 [设为首页] [加入收藏]
函数初识,第一章使用变量
分类:编程

前言:

*—*—python函数初识—*—*
一、函数的初识
若我们不使用len方法,该如何实现求字符串的长度?
答:使用for循环

s = 'tiancai'
count = 0
for i in s:
    count += 1    
print(count)

执行输出:
7

list列表

lis = ['aa','bb',11,22,'abc','天才']
count = 0
for i in lis:
    count += 1
print(count)

执行输出:
6

一、开篇概念明晰:

这个笔记是我个人总结,主要是熟练自己查看《Visual C# 从入门到精通》(第8版)这本书时,懵然起总结的想法,只是总结一些知识点,在工作项目会用得上,但是对毫无C#语言基础的,不大适合,因为里面会结合我自己的一些看法,估计需要一些基础才能看明白,如果需要一门入门级书籍还是要去购买《Visual C# 从入门到精通》(第8版)PDF版或者纸质版去一步步跟着书籍去练习操作。

 

多任务:

——清风一人醉

 

  • 协作式多任务:cpu可以处理多种任务,但是这些任务是排队等候的,当cpu在处理一个任务的时候,其他的任务被锁定,只有当cpu处理完当前任务,才可以继续处理下一个任务(专一暖男);
  • 抢占式多任务:一个任务正在执行,可以被强行中断挂起,去执行其他的任务(花心大萝卜)。

第I部分 Visual C#和Visual Studio 2015 概述

以上写法有2点不好的地方:

进程与线程:

第1章 使用变量、操作符和表达式

1.重复的代码多

  • 进程:内存和资源的物理分离成为进程。分配给进程的内存只有所属的进程才可以访问。一个应用程序可以启动多个进程
  • 线程:开发架构将程序中的一部分进行分离,使被分离的部分与程序的其余部分执行顺序不一致的操作。(在计算机中,程序的运行时由程序计数器决定的,程序计数器就像是一个指针,指定了应用程序下一步需要执行的指令。)
  • 进程与线程:一个进程启动,默认会有一个主线程,但是一个进程可以对应多个线程。
  • 时间片:处理器分配给线程的执行时间。一个处理器一次只能处理一个线程,所谓的多任务(抢占式)就是处理器在快速切换执行不同的线程。若是有多个处理器就不一样了。(自我入宫以来以为可以独得皇上宠爱,没想到皇上要雨露均沾)。

1.1 理解语句、标识符和关键字

语句是执行操作的命令,如计算值,存储结果,或者向用户显示消息。

 

C#语句遵循良好定义的规则集,而这些规则描述语句的格式和构成,称为语法

 

描述语句做什么的规范称为语义

 

*划重点 C#语句语法规则:**所有语句都必须以分号终止。**

 

标识符是对程序中的各个元素(命名空间、类、方法和变量)进行标识的名称。

 

*划重点 C#选择标识符语法规则:

  • 只能使用字母(大写和小写)、数字和下划线
  • 标识符必须以字母或下划线开头(如result,_name)

 

C#语言保留77个标识符供使用,这些标识符称为关键字,每个关键字有特定含义。如class,namespace,using等。(其它关键字想要了解,可百度一下。)

 

2.代码的可读性差

图片 1

1.2 使用变量存储信息

变量是容纳值的一个存储位置。在使用变量的时候要对它进行命名。例如 int count;

 

*划重点 命名变量规则:

  • 不要以下划线开头。虽然在C#中合法,但限制了和其它语言(如Visual Basic)的代码的互操作性。
  • 不要创建仅大小写不同的标识符。例如同时使用myVariable和MyVariable变量,它们易混淆。在Visual Basic这样不区分大小写的语言中,类的重用性也会受限。
  •  名称以小写字母开头。
  •  在包含多个单词的标识符中,从第二个单词起,每个单词都首字母大写(这种写法是驼峰式)例如camelCase。

 

 

中断:

1.3 使用基元数据类型

数据类型

描述

大小(位)

示例

int

整数

32

int count;

count =42;

long

整数(更大范围)

64

long wait;

wait =42L;

float

浮点数

32

float away;

away=0.42F;

double

双精度(更精确)浮点数

64

double trouble;

trouble =0.42;

decimal

货币值(具有比double更高的精度和更小的范围)

128

decimal coin;

coin =0.42M;

string

字符序列

每字符16位

string vest;

vest =“text”;

char

单字符

16

char text;

Text=‘x’;

bool

布尔值

8

bool teeth;

teeth=true;

 

注意:

L:表示long

F:表示float

M:表示decimal

 

写代码应当避免重复代码,以简化代码为荣。

前置知识点:

1.4 使用算术操作符

加号(+)、减号(-)、星号(*)、正斜杠(/)、百分号(%)分别执行加、减、乘、除、取模。它们成为操作符运算符,对值进行“操作”或“运算”来生成新值。在C#中,乘法类操作符(*,/和%)的优先级高于加法类操作符(+和-)。

 

注意:

操作符并不是适合所有数据类型,可使用任何算术操作符的数据类型char,int,long,float,double或decimal。

 

小知识点:字符串插值:开头的$符号表明这是插值字符串,{和}之间的任何表达式都需求值并置换。没有前置的$符号,字符串{“world”}将按字面处理。

我们通常在连接字符串习惯在中间用+连接,比如:

string text=“hello”+“world”;

 

字符串插值则允许改用以下语法:

string text=$”hello{“world”}”;

 

优点:字符串插值比+操作符高效的多。由于.NET Framework处理字符串的方式,用+来连接字符串可能消耗大量内存。字符串插值还更具可读性和减少犯错机会。

(技术无绝对,根据各人喜好用什么写法都可。)

 

对于这种情况,出现了函数这么个东东

1、进程是内存和资源的物理分离,只有所属线程才能访问;

1.5 变量递增递减

递增(++)和递减(--)是一元操作符,即只有一个操作数。它们具有相同的优先级和左结合性。递增和递减操作符与众不同之处在于,它们既可以放在变量前,也可以放在变量后。在变量前使用,称为这个操作符的前缀形式;在变量之后使用,则称为这个操作符的后缀形式。例如:

count++;//后缀递增

++count;//前缀递增

count--;//后缀递减

--count;//前缀递减

 

count++返回递增前的count值,而++count返回递增后的count值。

 

函数是封装好的,拿来就可以使用,用来实现单一或相关联功能的代码段。

2、一个cpu给一次只能执行一个线程,cpu给每一个线程分配时间片,多线程就是在不同线程之间快速切换。

1.6 声明隐式类型的局部变量

var myVariable=99;

var myOtherVariable=“hello”;

以上俩个变量myVariable和myOtherVariable称为隐式类型变量。var 关键字告诉编译器根据用于变量的初始化表达式判断变量类型。在以上例子中myVariable是int类型,而myOtherVariable是string类型。

 

注意:var只是在声明变量时提供一些方便。但变量一经声明,就只能编译器推断的那种类型的值赋给它。例如,不能再将float,double,string值赋给myVariable。

 

特别注意:只有提供表达式来初始化变量,才能使用关键字var。

以下声明会导致编译错误:

var test;//错误-编译器不能推断类型

函数:函数就是内部封装了一个功能的代码片段。

问题:进程间相互独立且不可访问,那么,cpu是怎么进行线程切换的,也就是问:一个线程正在执行,它要怎么知道要中断挂起,给其他线程来执行。

 

答案:Windows本身(其实也是处理器上正在运行的一个程序)有一个主线程----系统线程,负责其他线程的调度。

def func():
    #def 函数名(): 定义一个函数
    #函数名的书写规则跟变量一样
    #def与函数名直接有一个空格
    #def 函数名():冒号用来将函数名与函数体隔开,不能少,括号用来传参
    #函数体是函数里面的逻辑代码
    print(666)
    print(999)

线程本地存储器(Thread Local Storage,TLS):存储线程的状态信息。当一个线程执行的时间片到期的时候,需要存储下线程当前的状态信息,以确保在他被分配的下一个时间片可以正常的执行。TLS包含了:

 

  寄存器、堆栈指针、调度信息、内存中的地址空间和其他资源的使用信息。

代码是由上往下依次执行的,执行到def func()时

  其中寄存器中有一个是程序计数器,存放了线程接下来应该执行的指令。(CPU执行的指令的都是从寄存器读取的)

将func这个函数名加载到临时内存中,不执行。

中断:中断是一种机制,它能够使CPU指令的正常顺序执行转向计算机内存中的其他地方,而不需要知道目前正在执行什么程序。解释如下:

那么函数如何执行呢?

1、程序要开始执行一个线程之前:系统线程先决定线程要执行多长时间,and在当前线程的执行序列中放置一条中断指令。疑问:不确定这个指令是在时间片到了之后插入的还是在线程开始之前预先插入的,但推测是等待时间片要到的时候插入的,因为程序执行的指令并不是容易预测的,不同的数据不同走不同的逻辑分支,程序的执行是一边编一边走的(会先编译的快一些)而不是编译好所有的逻辑分支的指令,等待程序执行的时候根据数据进行选择,所以个人觉得很难预测要走哪一个逻辑分支,很难提前太早插入中断指令。

函数的执行方法:函数名()

2、程序开始执行一个线程:读取TLS中线程的程序计数器,把该程序计数器的指令指向的地址从TLS中拖拽出来插入到CPU执行的指令集合中,同时把TLS中的堆栈信息加载到CPU的其他寄存器中。线程开始执行

#执行函数
func()

3、当碰到中断指令时:存储当前线程的堆栈信息,记录当前线程的程序计数器数据,记录其他资源的信息,存储入TLS,把当前线程放入线程队列的末尾,返回到线程队列的开头准备执行队列的第一个线程,回到步骤1。

 当见到func(),只有见到()时,程序才会根据函数名从内存中找到函数体,然后执行它。没有括号是不会执行的。

图片 2

 

线程睡眠:线程退出执行队列一段时间称为睡眠。有时一个线程的执行需要一定的资源,但是当线程开始执行时,这个资源并没有生成或者正在被使用,因此线程需要等待一段时间。

 **二、函数的返回值 return**

时钟中断:一个线程进入睡眠是它会再次被打包放入TLS中,不过并不是放置在了TLS的末尾,而是放入了一个独立的睡眠队列中,为了时睡眠队列上的线程再次运行,需要使用另一种中断了标记他们,成为时钟中断。当一个睡眠的线程可以执行的时候,它才会被放入到可运行的线程队列中,的末尾。

    写函数,不要在函数内写print()

 线程终止:

本文由澳门新葡亰手机版发布于编程,转载请注明出处:函数初识,第一章使用变量

上一篇:创建共享参数,你不可能总是对的2 下一篇:没有了
猜你喜欢
热门排行
精彩图文